EXECUTE_AND_FETCH 过程 - 运行已解析 SELECT 命令并访存一行
EXECUTE_AND_FETCH 过程执行已解析的 SELECT 命令并访存一行。
语法
参数
- c
- 类型为 INTEGER 的输入自变量,用于指定要执行的 SELECT 命令的游标标识。
- exact
- 类型为 INTEGER 的可选自变量。如果设置为 1,并且结果集中的行数未正好等于 1,那么会抛出异常。如果设置为 0,那么不会抛出异常。缺省值为 0。如果 exact 设置为 1 并且结果集中没有任何行,那么会抛出 NO_DATA_FOUND (SQL0100W) 异常。如果 exact 设置为 1 并且结果集中有多行,那么会抛出 TOO_MANY_ROWS (SQL0811N) 异常。
- ret
- 类型为 INTEGER 的输出自变量,如果成功访存行,那么返回 1,如果未访存任何行,那么返回 0。
权限
对 DBMS_SQL 模块的 EXECUTE 特权。
使用说明
可通过在 PL/SQL 赋值语句中使用函数调用语法来调用此过程。
示例
示例 1:以下存储过程使用职员姓名来通过 EXECUTE_AND_FETCH 函数检索一个职员。如果找不到该职员,或者有多个同名职员,那么会抛出异常。
SET SERVEROUTPUT ON@
CREATE TABLE emp (
empno DECIMAL(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR(10),
job VARCHAR(9),
mgr DECIMAL(4),
hiredate TIMESTAMP(0),
sal DECIMAL(7,2) CONSTRAINT emp_sal_ck CHECK (sal > 0),
comm DECIMAL(7,2) )@
INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL)@
INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300)@
INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500)@
INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL)@
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400)@
CREATE OR REPLACE PROCEDURE select_by_name(
IN p_ename ANCHOR TO emp.ename)
BEGIN
DECLARE curid INTEGER;
DECLARE v_empno ANCHOR TO emp.empno;
DECLARE v_hiredate ANCHOR TO emp.hiredate;
DECLARE v_sal ANCHOR TO emp.sal;
DECLARE v_comm ANCHOR TO emp.comm;
DECLARE v_disp_date VARCHAR(10);
DECLARE v_sql VARCHAR(120);
DECLARE v_status INTEGER;
SET v_sql = 'SELECT empno, hiredate, sal, NVL(comm, 0)
FROM emp e WHERE ename = :p_ename ';
CALL DBMS_SQL.OPEN_CURSOR(curid);
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.BIND_VARIABLE_VARCHAR(curid, ':p_ename', UPPER(p_ename));
CALL DBMS_SQL.DEFINE_COLUMN_NUMBER(curid, 1, v_empno);
CALL DBMS_SQL.DEFINE_COLUMN_DATE(curid, 2, v_hiredate);
CALL DBMS_SQL.DEFINE_COLUMN_NUMBER(curid, 3, v_sal);
CALL DBMS_SQL.DEFINE_COLUMN_NUMBER(curid, 4, v_comm);
CALL DBMS_SQL.EXECUTE_AND_FETCH(curid, 1 /*True*/, v_status);
CALL DBMS_SQL.COLUMN_VALUE_NUMBER(curid, 1, v_empno);
CALL DBMS_SQL.COLUMN_VALUE_DATE(curid, 2, v_hiredate);
CALL DBMS_SQL.COLUMN_VALUE_NUMBER(curid, 3, v_sal);
CALL DBMS_SQL.COLUMN_VALUE_NUMBER(curid, 4, v_comm);
SET v_disp_date = TO_CHAR(v_hiredate, 'MM/DD/YYYY');
CALL DBMS_OUTPUT.PUT_LINE('Number : ' || v_empno);
CALL DBMS_OUTPUT.PUT_LINE('Name : ' || UPPER(p_ename));
CALL DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_disp_date);
CALL DBMS_OUTPUT.PUT_LINE('Salary : ' || v_sal);
CALL DBMS_OUTPUT.PUT_LINE('Commission: ' || v_comm);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END@
CALL select_by_name( 'MARTIN' )@此示例生成以下输出:
SET SERVEROUTPUT ON
DB20000I The SET SERVEROUTPUT command completed successfully.
CREATE TABLE emp
( empno DECIMAL(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR(10),
job VARCHAR(9),
mgr DECIMAL(4),
hiredate TIMESTAMP(0),
sal DECIMAL(7,2) CONSTRAINT emp_sal_ck CHECK (sal > 0),
comm DECIMAL(7,2) )
DB20000I The SQL command completed successfully.
INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL)
DB20000I The SQL command completed successfully.
INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300)
DB20000I The SQL command completed successfully.
INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500)
DB20000I The SQL command completed successfully.
INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL)
DB20000I The SQL command completed successfully.
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400)
DB20000I The SQL command completed successfully.
CREATE OR REPLACE PROCEDURE select_by_name(
IN p_ename ANCHOR TO emp.ename)
BEGIN
DECLARE curid INTEGER;
DECLARE v_empno ANCHOR TO emp.empno;
DECLARE v_hiredate ANCHOR TO emp.hiredate;
DECLARE v_sal ANCHOR TO emp.sal;
DECLARE v_comm ANCHOR TO emp.comm;
DECLARE v_disp_date VARCHAR(10);
DECLARE v_sql VARCHAR(120);
DECLARE v_status INTEGER;
SET v_sql = 'SELECT empno, hiredate, sal, NVL(comm, 0)
FROM emp e WHERE ename = :p_ename ';
CALL DBMS_SQL.OPEN_CURSOR(curid);
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.BIND_VARIABLE_VARCHAR(curid, ':p_ename', UPPER(p_ename));
CALL DBMS_SQL.DEFINE_COLUMN_NUMBER(curid, 1, v_empno);
CALL DBMS_SQL.DEFINE_COLUMN_DATE(curid, 2, v_hiredate);
CALL DBMS_SQL.DEFINE_COLUMN_NUMBER(curid, 3, v_sal);
CALL DBMS_SQL.DEFINE_COLUMN_NUMBER(curid, 4, v_comm);
CALL DBMS_SQL.EXECUTE_AND_FETCH(curid, 1 /*True*/, v_status);
CALL DBMS_SQL.COLUMN_VALUE_NUMBER(curid, 1, v_empno);
CALL DBMS_SQL.COLUMN_VALUE_DATE(curid, 2, v_hiredate);
CALL DBMS_SQL.COLUMN_VALUE_NUMBER(curid, 3, v_sal);
CALL DBMS_SQL.COLUMN_VALUE_NUMBER(curid, 4, v_comm);
SET v_disp_date = TO_CHAR(v_hiredate, 'MM/DD/YYYY');
CALL DBMS_OUTPUT.PUT_LINE('Number : ' || v_empno);
CALL DBMS_OUTPUT.PUT_LINE('Name : ' || UPPER(p_ename));
CALL DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_disp_date);
CALL DBMS_OUTPUT.PUT_LINE('Salary : ' || v_sal);
CALL DBMS_OUTPUT.PUT_LINE('Commission: ' || v_comm);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END
DB20000I The SQL command completed successfully.
CALL select_by_name( 'MARTIN' )
Return Status = 0
Number : 7654
Name : MARTIN
Hire Date : 09/28/1981
Salary : 1250.00
Commission: 1400.00
