Create and Populate Table
CREATE TABLE stuff
(
pk INTEGER PRIMARY KEY,
description VARCHAR2 (100)
)
Table created.
BEGIN
FOR indx IN 1 .. 4
LOOP
INSERT INTO stuff (pk, description)
VALUES (indx, 'Stuff ' || indx);
END LOOP;
COMMIT;
END;
1 row(s) inserted.
Use Package to Reduce Code in Each Test
CREATE OR REPLACE PACKAGE pkg
IS
c_limit CONSTANT PLS_INTEGER := 3;
CURSOR stuff_cur
IS
SELECT * FROM stuff;
TYPE stuff_aat IS TABLE OF stuff_cur%ROWTYPE
INDEX BY PLS_INTEGER;
g_stuff stuff_aat;
END;
Package created.
EXIT WHEN %NOTFOUND Immediately After Fetch
BEGIN
DBMS_OUTPUT.put_line ('EXIT WHEN %NOTFOUND right after fetch');
OPEN pkg.stuff_cur;
LOOP
FETCH pkg.stuff_cur BULK COLLECT INTO pkg.g_stuff LIMIT pkg.c_limit;
DBMS_OUTPUT.put_line (' Fetched ' || pkg.g_stuff.COUNT || ' rows.');
EXIT WHEN pkg.stuff_cur%NOTFOUND;
FOR indx IN 1 .. pkg.g_stuff.COUNT
LOOP
DBMS_OUTPUT.put_line (' Do stuff ' || indx);
END LOOP;
END LOOP;
CLOSE pkg.stuff_cur;
END;
EXIT WHEN %NOTFOUND right after fetch
Fetched 3 rows.
Do stuff 1
Do stuff 2
Do stuff 3
Fetched 1 rows.
EXIT WHEN COUNT = 0 Right after Fetch
BEGIN
DBMS_OUTPUT.put_line ('EXIT WHEN COUNT = 0 right after fetch');
OPEN pkg.stuff_cur;
LOOP
FETCH pkg.stuff_cur BULK COLLECT INTO pkg.g_stuff LIMIT pkg.c_limit;
DBMS_OUTPUT.put_line (' Fetched ' || pkg.g_stuff.COUNT || ' rows.');
EXIT WHEN pkg.g_stuff.COUNT = 0;
FOR indx IN 1 .. pkg.g_stuff.COUNT
LOOP
DBMS_OUTPUT.put_line (' Do stuff ' || indx);
END LOOP;
END LOOP;
CLOSE pkg.stuff_cur;
END;
EXIT WHEN COUNT = 0 right after fetch
Fetched 3 rows.
Do stuff 1
Do stuff 2
Do stuff 3
Fetched 1 rows.
Do stuff 1
Fetched 0 rows.
EXIT WHEN %NOTFOUND at End of Loop
BEGIN
DBMS_OUTPUT.put_line ('EXIT WHEN %NOTFOUND at end of loop');
OPEN pkg.stuff_cur;
LOOP
FETCH pkg.stuff_cur BULK COLLECT INTO pkg.g_stuff LIMIT pkg.c_limit;
DBMS_OUTPUT.put_line (' Fetched ' || pkg.g_stuff.COUNT || ' rows.');
FOR indx IN 1 .. pkg.g_stuff.COUNT
LOOP
DBMS_OUTPUT.put_line (' Do stuff ' || indx);
END LOOP;
EXIT WHEN pkg.stuff_cur%NOTFOUND;
END LOOP;
CLOSE pkg.stuff_cur;
END;
EXIT WHEN %NOTFOUND at end of loop
Fetched 3 rows.
Do stuff 1
Do stuff 2
Do stuff 3
Fetched 1 rows.
Do stuff 1
EXIT WHEN COUNT < LIMIT at End of Loop
BEGIN
DBMS_OUTPUT.put_line ('EXIT WHEN COUNT < limit at end of loop');
OPEN pkg.stuff_cur;
LOOP
FETCH pkg.stuff_cur BULK COLLECT INTO pkg.g_stuff LIMIT pkg.c_limit;
DBMS_OUTPUT.put_line (' Fetched ' || pkg.g_stuff.COUNT || ' rows.');
FOR indx IN 1 .. pkg.g_stuff.COUNT
LOOP
DBMS_OUTPUT.put_line (' Do stuff ' || indx);
END LOOP;
EXIT WHEN pkg.g_stuff.COUNT < pkg.c_limit;
END LOOP;
CLOSE pkg.stuff_cur;
END;
EXIT WHEN COUNT < limit at end of loop
Fetched 3 rows.
Do stuff 1
Do stuff 2
Do stuff 3
Fetched 1 rows.
Do stuff 1