結果セットを必要としなくなった時点で、オープン状態のカーソル変数が保持するリソースを解放するには、CLOSE 文を使用します。
カーソル変数は、クローズ時の動作において静的カーソルとは異なります。
| カーソルの種類 | 動作 |
|---|---|
| 静的カーソル | 再オープンする前に必ずクローズする必要があります。 |
| カーソル変数 | 再オープン前にクローズする必要はありません。OPEN ... FOR を既にオープン済みのカーソル変数に対して実行すると、以前の結果セットが破棄され、新しいクエリの結果セットで置き換えられます。 |
カーソル変数をクローズした後は、その結果セットへアクセスできなくなります。結果セットを必要としなくなった時点でカーソル変数をクローズし、基盤となるリソースを再利用可能にしてください。
例
以下のプロシージャでは、指定された部署の従業員レコードをフェッチし、ループ完了後にカーソル変数をクローズします。
CREATE OR REPLACE PROCEDURE emp_by_dept (
p_deptno emp.deptno%TYPE
)
IS
emp_refcur SYS_REFCURSOR;
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
BEGIN
OPEN emp_refcur FOR SELECT empno, ename FROM emp WHERE deptno = p_deptno;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_refcur INTO v_empno, v_ename;
EXIT WHEN emp_refcur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
CLOSE emp_refcur;
END;部署番号 20 でプロシージャを実行します。
EXEC emp_by_dept(20)期待される出力:
EMPNO ENAME
----- -------
7369 SMITH
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD