每個(gè)游標(biāo)都有%ISOPEN、%FOUND、%NOTFOUND 和 %ROWCOUNT四個(gè)屬性,用于測(cè)試游標(biāo)的狀態(tài)。本文為您介紹這些屬性及示例。

%ISOPEN

%ISOPEN屬性用于測(cè)試游標(biāo)是否已打開(kāi)。

cursor_name%ISOPEN

cursor_name是游標(biāo)的名稱,如果游標(biāo)打開(kāi),將返回BOOLEAN數(shù)據(jù)類型TRUE,否則將返回FALSE

下面是使用%ISOPEN的示例。

CREATE OR REPLACE PROCEDURE cursor_example
IS
        ...
    CURSOR emp_cur_1 IS SELECT * FROM emp;
        ...
BEGIN
        ...
    IF emp_cur_1%ISOPEN THEN
        NULL;
    ELSE
        OPEN emp_cur_1;
    END IF;
    FETCH emp_cur_1 INTO ...
        ...
END;

%FOUND

%FOUND屬性用于測(cè)試在對(duì)游標(biāo)執(zhí)行FETCH操作之后是否從指定游標(biāo)的結(jié)果集中檢索到行。

cursor_name%FOUND

cursor_name是游標(biāo)的名稱,如果在FETCH之后從游標(biāo)的結(jié)果集中檢索到行,則將返回BOOLEAN數(shù)據(jù)類型TRUE。

在結(jié)果集的最后一行被FETCH之后,下一個(gè)FETCH將導(dǎo)致%FOUND返回 FALSE。如果結(jié)果集中沒(méi)有行,則第一個(gè)FETCH之后也會(huì)返回FALSE。

在游標(biāo)打開(kāi)之前或關(guān)閉游標(biāo)之后對(duì)游標(biāo)引用%FOUND會(huì)導(dǎo)致引發(fā)INVALID_CURSOR異常。

如果游標(biāo)已打開(kāi),但在第一個(gè)FETCH之前引用%FOUND,它將返回null。

以下示例使用%FOUND

CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_emp_rec       emp%ROWTYPE;
    CURSOR emp_cur_1 IS SELECT * FROM emp;
BEGIN
    OPEN emp_cur_1;
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    FETCH emp_cur_1 INTO v_emp_rec;
    WHILE emp_cur_1%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE(v_emp_rec.empno || '     ' || v_emp_rec.ename);
        FETCH emp_cur_1 INTO v_emp_rec;
    END LOOP;
    CLOSE emp_cur_1;
END;

調(diào)用前面的存儲(chǔ)過(guò)程時(shí),輸出顯示如下:

EXEC cursor_example;

EMPNO    ENAME
-----    ------
7369     SMITH
7499     ALLEN
7521     WARD
7566     JONES
7654     MARTIN
7698     BLAKE
7782     CLARK
7788     SCOTT
7839     KING
7844     TURNER
7876     ADAMS
7900     JAMES
7902     FORD
7934     MILLER

%NOTFOUND

%NOTFOUND屬性是%FOUND的邏輯對(duì)立面。

cursor_name%NOTFOUND

cursor_name是游標(biāo)的名稱,如果在FETCH之后從游標(biāo)的結(jié)果集中檢索到行,則將返回BOOLEAN 數(shù)據(jù)類型FALSE。

在結(jié)果集的最后一行被FETCH之后,下一個(gè)FETCH將導(dǎo)致%NOTFOUND返回TRUE。如果結(jié)果集中沒(méi)有行,則第一個(gè)FETCH之后也會(huì)返回TRUE

在游標(biāo)打開(kāi)之前或關(guān)閉游標(biāo)之后對(duì)游標(biāo)引用%NOTFOUND會(huì)導(dǎo)致引發(fā)INVALID_CURSOR異常。

如果游標(biāo)已打開(kāi),但在第一個(gè)FETCH之前引用%NOTFOUND,它將返回null。

以下示例使用%NOTFOUND。

CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_emp_rec       emp%ROWTYPE;
    CURSOR emp_cur_1 IS SELECT * FROM emp;
BEGIN
    OPEN emp_cur_1;
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    LOOP
        FETCH emp_cur_1 INTO v_emp_rec;
        EXIT WHEN emp_cur_1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_emp_rec.empno || '     ' || v_emp_rec.ename);
    END LOOP;
    CLOSE emp_cur_1;
END;

與前面的示例類似,此存儲(chǔ)過(guò)程在調(diào)用時(shí)會(huì)生成相同的輸出。

EXEC cursor_example;

EMPNO    ENAME
-----    ------
7369     SMITH
7499     ALLEN
7521     WARD
7566     JONES
7654     MARTIN
7698     BLAKE
7782     CLARK
7788     SCOTT
7839     KING
7844     TURNER
7876     ADAMS
7900     JAMES
7902     FORD
7934     MILLER

%ROWCOUNT

%ROWCOUNT屬性返回一個(gè)整數(shù),顯示到目前為止通過(guò)FETCH從指定游標(biāo)獲取的行數(shù)。

cursor_name%ROWCOUNT

cursor_name是游標(biāo)的名稱,%ROWCOUNT對(duì)其返回到目前為止檢索的行數(shù)。在檢索到最后一行之后,%ROWCOUNT仍然設(shè)置為在游標(biāo)關(guān)閉之前返回的總行數(shù),此時(shí)如果引用%ROWCOUNT,它將引發(fā) INVALID_CURSOR 異常。

在游標(biāo)打開(kāi)之前或關(guān)閉游標(biāo)之后對(duì)游標(biāo)引用%ROWCOUNT會(huì)導(dǎo)致引發(fā)INVALID_CURSOR異常。

如果游標(biāo)已打開(kāi),但在第一個(gè)FETCH之前引用%ROWCOUNT,它將返回0。如果結(jié)果集中沒(méi)有行,%ROWCOUNT也會(huì)在第一個(gè)FETCH后返回0。

以下示例使用%ROWCOUNT。

CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_emp_rec       emp%ROWTYPE;
    CURSOR emp_cur_1 IS SELECT * FROM emp;
BEGIN
    OPEN emp_cur_1;
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    LOOP
        FETCH emp_cur_1 INTO v_emp_rec;
        EXIT WHEN 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 || ' rows were retrieved');
    CLOSE emp_cur_1;
END;

此存儲(chǔ)過(guò)程輸出在員工列表末尾檢索的總行數(shù),如下所示:

EXEC cursor_example;

EMPNO    ENAME
-----    -------
7369     SMITH
7499     ALLEN
7521     WARD
7566     JONES
7654     MARTIN
7698     BLAKE
7782     CLARK
7788     SCOTT
7839     KING
7844     TURNER
7876     ADAMS
7900     JAMES
7902     FORD
7934     MILLER
**********************
14 rows were retrieved

游標(biāo)狀態(tài)和屬性摘要

下表總結(jié)了可能的游標(biāo)狀態(tài)和游標(biāo)屬性返回的值。

游標(biāo)狀態(tài) %ISOPEN %FOUND %NOTFOUND %ROWCOUNT
在OPEN之前 False INVALID_CURSOR異常 INVALID_CURSOR異常 INVALID_CURSOR異常
在OPEN之后,第一個(gè)FETCH之前 True Null Null 0
第一個(gè)成功的FETCH之后 True True False 1
第n個(gè)成功的FETCH之后(最后一行) True True False n
第n+1個(gè)FETCH之后(最后一行之后) True False True n
在CLOSE之后 False INVALID_CURSOR異常 INVALID_CURSOR異常 INVALID_CURSOR異常