ここではPL/SQLのカーソル属性について紹介します。

%ISOPEN属性

%ISOPEN属性は、カーソルがオープンされている場合はTRUEを戻します。オープンされていない場合はFALSEを戻します。

以下は%ISOPEN属性のサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    CURSOR c1 IS SELECT * FROM emp;

BEGIN
     OPEN c1;
    IF c1%ISOPEN THEN
        DBMS_OUTPUT.PUT_LINE('カーソルがOPNEされています。');
    ELSE
        DBMS_OUTPUT.PUT_LINE('カーソルがOPNEされていません。');
    END IF;
    CLOSE c1;

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


%FOUND属性

%FOUND属性は、カーソルがオープンされてから最初のフェッチまでNULLを戻します。 その後、直前のフェッチが行を戻した場合はTRUEを戻し、直前のフェッチが行を戻さなかった場合はFALSEを戻します。

以下は%FOUND属性のサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    CURSOR c1 IS SELECT * FROM emp;
    wRec emp%ROWTYPE;

BEGIN
    OPEN c1;
    LOOP
        FETCH c1 INTO wRec;
        IF c1%FOUND THEN
            DBMS_OUTPUT.PUT_LINE(wRec.emp_no || ':' || wRec.emp_name);
        ELSE
            EXIT;
        END IF;
    END LOOP;
    CLOSE c1;

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


%NOTFOUND属性

%NOTFOUND属性は、カーソルがオープンされてから最初のフェッチまではNULLを戻します。 その後、直前のフェッチが行を戻した場合はFALSEを戻し、直前のフェッチが行を戻さなかった場合はTRUEを戻します。

以下は%NOTFOUND属性のサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    CURSOR c1 IS SELECT * FROM emp;
    wRec emp%ROWTYPE;

BEGIN
    OPEN c1;
    LOOP
        FETCH c1 INTO wRec;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(wRec.emp_no || ':' || wRec.emp_name);
    END LOOP;
    CLOSE c1;

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


%ROWCOUNT属性

%ROWCOUNT属性は、カーソルがオープンされると0(ゼロ)になります。 最初のフェッチまでは0(ゼロ)を戻します。その後は、これまでにフェッチした行数を戻します。

以下は%ROWCOUNT属性のサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    CURSOR c1 IS SELECT * FROM emp;
    wRec emp%ROWTYPE;

BEGIN
    OPEN c1;
    LOOP
        FETCH c1 INTO wRec;
        IF c1%FOUND THEN
            DBMS_OUTPUT.PUT_LINE(wRec.emp_no || ':' || wRec.emp_name);
        ELSE
            EXIT;
        END IF;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE ('データ件数=' || c1%ROWCOUNT);
    CLOSE c1;

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


以上、PL/SQLのカーソル属性ついて解説しました。