は、OPEN FOR usingステートメントを使用した動的クエリもサポートしています。 文字列リテラルまたは文字列変数は、OPEN FOR USINGステートメントでSELECTステートメントに提供されます。
オープン名FOR dynamic_string
[使用bind_arg [, bind_arg_2 ] ...] ;
nameは、以前に宣言されたカーソル変数の識別子です。 dynamic_stringは、SELECTステートメントを含む文字列リテラルまたは文字列変数です (終了セミコロン (;) なし) 。 bind_arg, bind_arg_2... は、カーソル変数を開いたときにSELECTステートメントの対応するプレースホルダーに変数を渡すために使用されるバインド引数です。 プレースホルダは、コロン文字の先頭に付された識別子である。
次のコードは、文字列リテラルを使用した動的クエリの例です。
CREATE OR REPLACE PROCEDURE dept_query
IS
emp_refcur SYS_REFCURSOR;
v_empno emp.empno%TYPE;
v_ename emp.ename % TYPE;
開始
OPEN emp_refcur FOR 'SELECT empno, ename FROM emp WHERE deptno = 30 '| |
'AND sal >= 1500';
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_refcurにv_empno、v_ename;
emp_refcur % NOTFOUNDのときに終了します。
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
閉じるemp_refcur;
エンド;
プロシージャが実行されると、次の出力が生成されます。
EXEC dept_query;
EMPNO ENAME
----- -------
7499アレン
7698 BLAKE
7844ターナー
次の例では、前のクエリがバインド引数を使用してクエリパラメータを渡すように変更されています。
CREATE OR REPLACE PROCEDURE dept_query (
p_deptno emp.de ptno % TYPE、
p_sal emp.sal % タイプ
)
IS
emp_refcur SYS_REFCURSOR;
v_empno emp.empno%TYPE;
v_ename emp.ename % TYPE;
開始
OPEN emp_refcur FOR 'SELECT empno, ename FROM emp WHERE deptno = :dept'
| | 'AND sal >= :sal' 使用p_deptno、p_sal;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_refcurにv_empno、v_ename;
emp_refcur % NOTFOUNDのときに終了します。
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
閉じるemp_refcur;
エンド;
次の出力が生成されます。
EXEC dept_query (30, 1500);
EMPNO ENAME
----- -------
7499アレン
7698 BLAKE
7844ターナー
最後に、文字列変数を使用してSELECTを渡します。 これは、最大の柔軟性を提供する。
CREATE OR REPLACE PROCEDURE dept_query (
p_deptno emp.de ptno % TYPE、
p_sal emp.sal % タイプ
)
IS
emp_refcur SYS_REFCURSOR;
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
p_query_string VARCHAR2 (100);
開始
p_query_string := 'SELECT empno、ename FROM emp WHERE '| |
'deptno = :dept AND sal >= :sal';
p_query_string USING p_deptno、p_salのためのOPEN emp_refcur;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_refcurにv_empno、v_ename;
emp_refcur % NOTFOUNDのときに終了します。
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
閉じるemp_refcur;
エンド;
EXEC dept_query (20, 1500);
EMPNO ENAME
----- -------
7566ジョーンズ
7788スコット
7902フォード