すべてのプロダクト
Search
ドキュメントセンター

PolarDB:REF CURSORによる動的クエリ

最終更新日:May 29, 2024

は、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フォード