Table 6-1 Cursor Attribute Values
%FOUND | %ISOPEN | %NOTFOUND | %ROWCOUNT | ||
---|---|---|---|---|---|
OPEN | before | exception | FALSE |
exception | exception |
after | NULL |
TRUE |
NULL |
0 | |
First FETCH | before | NULL |
TRUE |
NULL |
0 |
after | TRUE |
TRUE |
FALSE |
1 | |
Next FETCH(es) | before | TRUE |
TRUE |
FALSE |
1 |
after | TRUE |
TRUE |
FALSE |
data dependent | |
Last FETCH | before | TRUE |
TRUE |
FALSE |
data dependent |
after | FALSE |
TRUE |
TRUE |
data dependent | |
CLOSE | before | FALSE |
TRUE |
TRUE |
data dependent |
after | exception | FALSE |
exception | exception |
The following applies to the information in Table 6-1:
Example 6-17 Using %ROWCOUNT
DECLARE CURSOR c1 IS SELECT last_name FROM employees WHERE ROWNUM < 11; name employees.last_name%TYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO name; EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL; DBMS_OUTPUT.PUT_LINE(c1%ROWCOUNT || '. ' || name); IF c1%ROWCOUNT = 5 THEN DBMS_OUTPUT.PUT_LINE('--- Fetched 5th record ---'); END IF; END LOOP; CLOSE c1; END;
Example 6-16 Using %NOTFOUND
DECLARE CURSOR c1 IS SELECT last_name, salary FROM employees WHERE ROWNUM < 11; my_ename employees.last_name%TYPE; my_salary employees.salary%TYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO my_ename, my_salary; IF c1%NOTFOUND THEN -- fetch failed, so exit loop -- Another form of this test is "EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;" EXIT; ELSE -- fetch succeeded DBMS_OUTPUT.PUT_LINE('Name = ' || my_ename || ', salary = ' || my_salary); END IF; END LOOP; END; /
DECLARE CURSOR c1 IS SELECT last_name, salary FROM employees WHERE ROWNUM < 11; the_name employees.last_name%TYPE; the_salary employees.salary%TYPE; BEGIN IF c1%ISOPEN = FALSE THEN -- cursor was not already open OPEN c1; END IF; FETCH c1 INTO the_name, the_salary; CLOSE c1; END; /
Example 6-14 Using %FOUND
DECLARE CURSOR c1 IS SELECT last_name, salary FROM employees WHERE ROWNUM < 11; my_ename employees.last_name%TYPE; my_salary employees.salary%TYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO my_ename, my_salary; IF c1%FOUND THEN -- fetch succeeded DBMS_OUTPUT.PUT_LINE('Name = ' || my_ename || ', salary = ' || my_salary); ELSE -- fetch failed, so exit loop EXIT; END IF; END LOOP; END; /
'Drop Database' 카테고리의 다른 글
다중의 결과값을 하나의 행으로 컴마로 분리해 출력하는 방법 (0) | 2008.08.28 |
---|---|
에효...맨날 알면서도 당하는거.. (0) | 2008.07.24 |
10 Handling PL/SQL Errors (0) | 2008.06.23 |
일반적인 정규 표현식 (0) | 2008.06.13 |
정규 표현식을 이용한 SQL 구문의 개선 (1 부에 이어 계속) (0) | 2008.06.13 |