每個(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異常 |