各カーソルには、% ISOPEN、% FOUND、% NOTFOUND、および % ROWCOUNTの4つの属性があります。 これらの属性は、カーソルの状態をテストするために使用されます。 このトピックでは、これらの属性とその例について説明します。
% ISOPEN
% ISOPEN属性は、カーソルが開いているかどうかをテストするために使用されます。
cursor_name % ISOPEN
cursor_nameはカーソルの名前です。 カーソルが開いている場合、BOOLEANデータ型のTRUEが返されます。 それ以外の場合、FALSEが返されます。
次の例では、% ISOPENを使用します。
CREATE OR REPLACE PROCEDURE cursor_example
IS
...
CURSOR emp_cur_1はempから選択 * です。
...
BEGIN
...
IF emp_cur_1 % ISOPEN THEN
NULL;
ELSE
OPEN emp_cur_1;
END IF;
FETCH emp_cur_1へ...
...
エンド;
% FOUND
% FOUND属性は、カーソルに対してFETCH操作が実行された後に、指定されたカーソルの結果セットから行が取得されるかどうかをテストするために使用されます。
cursor_name % FOUND
cursor_nameはカーソルの名前です。 FETCH操作が実行された後にカーソルの結果セットから行が取得された場合、BOOLEANデータ型のTRUEが返されます。
結果セットの最後の行がFETCH操作でフェッチされた後、% FOUNDは次のFETCH操作のためにFALSEを返します。 結果セットに行がない場合は、最初のFETCH操作の後にFALSEも返されます。
カーソルを開く前またはカーソルを閉じた後に % FOUNDがカーソル上で参照されている場合、INVALID_CURSOR例外が発生します。
カーソルが開いていて、最初のFETCH操作の前に % FOUNDが参照されている場合、% FOUNDはnullを返します。
% FOUNDは次の例で使用されます。
CREATE OR REPLACE PROCEDURE cursor_example
IS
v_emp_rec emp % ROWTYPE;
CURSOR emp_cur_1はempから選択 * です。開始
OPEN emp_cur_1;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
FETCH emp_cur_1にv_emp_rec;
emp_cur_1 % FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_emp_rec.empno | | '| | v_emp_rec.ename);
FETCH emp_cur_1にv_emp_rec;
END LOOP;
閉じるemp_cur_1;
エンド;
前のストアドプロシージャが呼び出されると、次の出力が表示されます。
EXEC cursor_example;
EMPNO ENAME
----- ------
7369スミス
7499アレン
7521ワード
7566ジョーンズ
7654マーティン
7698 BLAKE
7782 CLARK
7788スコット
7839キング
7844ターナー
7876アダムス
7900ジェームズ
7902フォード
7934ミラー
% NOTFOUND
% NOTFOUND属性は、% FOUNDの論理的な反対です。
cursor_name % NOTFOUND
cursor_nameはカーソルの名前です。 FETCH操作後にカーソルの結果セットから行が取得された場合、BOOLEANデータ型のFALSEが返されます。
結果セットの最後の行がFETCH操作でフェッチされた後、% NOTFOUNDは次のFETCH操作のためにTRUEを返します。 結果セットに行がない場合は、最初のFETCH操作の後にTRUEも返されます。
カーソルを開く前またはカーソルを閉じた後に、% NOTFOUNDがカーソル上で参照されている場合、INVALID_CURSOR例外が発生します。
カーソルが開いていて、最初のFETCH操作の前に % NOTFOUNDが参照されている場合、% NOTFOUNDはnullを返します。
次の例では、% NOTFOUNDを使用します。
CREATE OR REPLACE PROCEDURE cursor_example
IS
v_emp_rec emp % ROWTYPE;
CURSOR emp_cur_1はempから選択 * です。開始
OPEN emp_cur_1;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_cur_1にv_emp_rec;
emp_cur_1 % NOTFOUNDのときに終了します。
DBMS_OUTPUT.PUT_LINE(v_emp_rec.empno | | '| | v_emp_rec.ename);
END LOOP;
閉じるemp_cur_1;
エンド;
このストアドプロシージャは、ストアドプロシージャが呼び出されると、前の例と同じ出力を生成します。
EXEC cursor_example;
EMPNO ENAME
----- ------
7369スミス
7499アレン
7521ワード
7566ジョーンズ
7654マーティン
7698 BLAKE
7782 CLARK
7788スコット
7839キング
7844ターナー
7876アダムス
7900ジェームズ
7902フォード
7934ミラー
% ROWCOUNT
% ROWCOUNT属性は、現在までにFETCH操作で指定されたカーソルからフェッチされた行数を示す整数を返します。
cursor_name % ROWCOUNT
cursor_nameはカーソルの名前です。 このカーソルの場合、% ROWCOUNTは現在取得されている行数を返します。 最後の行が取得された後も、カーソルを閉じる前に返される行の総数として % ROWCOUNTが指定されます。 この場合、% ROWCOUNTが参照されると、INVALID_CURSOR例外が発生します。
カーソルを開く前、またはカーソルを閉じた後に、% ROWCOUNTがカーソル上で参照されている場合、INVALID_CURSOR例外が発生します。
カーソルが開かれ、最初のFETCH操作の前に % ROWCOUNTが参照されている場合、% ROWCOUNTは0を返します。 % ROWCOUNTは、結果セットに行がない場合、最初のFETCH操作の後に0も返します。
次の例では、% ROWCOUNTを使用します。
CREATE OR REPLACE PROCEDURE cursor_example
IS
v_emp_rec emp % ROWTYPE;
CURSOR emp_cur_1はempから選択 * です。開始
OPEN emp_cur_1;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_cur_1にv_emp_rec;
emp_cur_1 % NOTFOUNDのときに終了します。
DBMS_OUTPUT.PUT_LINE(v_emp_rec.empno | | '| | v_emp_rec.ename);
END LOOP;
DBMS_OUTPUT.PUT_LINE('**********************');
DBMS_OUTPUT.PUT_LINE(emp_cur_1 % ROWCOUNT | | '行が取得されました');
閉じるemp_cur_1;
エンド;
このストアドプロシージャは、次の例に示すように、従業員リストの最後に取得される行の総数を生成します。
EXEC cursor_example;
EMPNO ENAME
----- -------
7369スミス
7499アレン
7521ワード
7566ジョーンズ
7654マーティン
7698 BLAKE
7782 CLARK
7788スコット
7839キング
7844ターナー
7876アダムス
7900ジェームズ
7902フォード
7934ミラー
**********************
14行が取得されました
カーソルの状態と属性の概要
次の表は、可能なカーソル状態と、カーソル属性によって返される値をまとめたものです。
| カーソル状態 | % ISOPEN | % FOUND | % NOTFOUND | % ROWCOUNT |
| 開く前に | False | INVALID_CURSOR例外 | INVALID_CURSOR例外 | INVALID_CURSOR例外 |
| オープン後と最初のフェッチの前 | 正しい | ヌル | ヌル | 0 |
| 最初の成功したフェッチの後 | 正しい | 正しい | False | 1 |
| n回目のFETCH成功後 (最後の行) | 正しい | 正しい | False | n |
| (n + 1) 番目のFETCHの後 (最後の行の後) | 正しい | False | True | n |
| クローズ後 | False | INVALID_CURSOR例外 | INVALID_CURSOR例外 | INVALID_CURSOR例外 |