例: プロシージャーから REF CURSOR を返す (PL/SQL)

この例では、REF CURSOR 変数を定義およびオープンし、次いでプロシージャー・パラメーターとして渡す方法を示します。

次のようにカーソル変数を IN OUT パラメーターとして指定することにより、プロシージャーの呼び出し元で結果セットを使用できるようにします。
CREATE OR REPLACE PROCEDURE emp_by_job (
    p_job           VARCHAR2,
    p_emp_refcur    IN OUT SYS_REFCURSOR
)
IS
BEGIN
    OPEN p_emp_refcur FOR SELECT empno, ename FROM emp WHERE job = p_job;
END;
以下の無名ブロックでは、プロシージャーの IN OUT パラメーターを、無名ブロックの宣言セクション内で宣言したカーソル変数に対して割り当てることにより、EMP_BY_JOB プロシージャーが呼び出されます。 このカーソル変数を使用することにより、結果セットがフェッチされます。
DECLARE
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE := 'SALESMAN';
    v_emp_refcur    SYS_REFCURSOR;
BEGIN
    DBMS_OUTPUT.PUT_LINE('EMPLOYEES WITH JOB ' || v_job);
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    emp_by_job(v_job, v_emp_refcur);
    LOOP
        FETCH v_emp_refcur INTO v_empno, v_ename;
        EXIT WHEN v_emp_refcur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_empno || '     ' || v_ename);
    END LOOP;
    CLOSE v_emp_refcur;
END;
以下に、無名ブロックの実行時に生成される出力例を示します。
EMPLOYEES WITH JOB SALESMAN
EMPNO    ENAME
-----    -------
7499     ALLEN
7521     WARD
7654     MARTIN
7844     TURNER