EXECUTE_AND_FETCH プロシージャー - 解析済み SELECT コマンドを実行して 1 行をフェッチする
EXECUTE_AND_FETCH プロシージャーは、解析済み SELECT コマンドを実行し、1 行をフェッチします。
構文
パラメーター
- c
- 実行する SELECT コマンドのカーソルのカーソル ID を指定する、タイプ INTEGER の入力引数。
- exact
- タイプ INTEGER のオプション引数。 1 に設定した場合は、結果セットの行数が厳密に 1 に等しくなければ例外がスローされます。0 に設定すると、例外はスローされません。 デフォルトは 0 です。exact が 1 に設定されていて結果セットに行がない場合は、NO_DATA_FOUND (SQL0100W) 例外がスローされます。 exact が 1 に設定されていて結果セットに複数の行がある場合は、TOO_MANY_ROWS (SQL0811N) 例外がスローされます。
- ret
- 行が正常にフェッチされた場合は 1 を戻し、フェッチする行がない場合は 0 を戻す、タイプ INTEGER の出力引数。
許可
DBMS_SQL モジュールに対する EXECUTE 特権。
使用上の注意
このプロシージャーは、PL/SQL 割り当てステートメントで関数呼び出し構文を使用して呼び出すことができます。
例
例 1: 次のストアード・プロシージャーは、EXECUTE_AND_FETCH 関数を使用して、従業員の名前で 1 人の従業員を検索します。 従業員が見つからない場合、あるいは同じ名前の従業員が複数いる場合は、例外がスローされます。
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
