CREATE TABLE plch_parts
(
partnum INTEGER PRIMARY KEY,
partname VARCHAR2 (100) UNIQUE
)
Table created.
BEGIN
INSERT INTO plch_parts
VALUES (1, 'Mouse');
INSERT INTO plch_parts
VALUES (100, 'Keyboard');
INSERT INTO plch_parts
VALUES (500, 'Monitor');
INSERT INTO plch_parts
VALUES (501, 'No-res Webcam');
INSERT INTO plch_parts
VALUES (502, 'Ultraviolet Switch');
INSERT INTO plch_parts
VALUES (1000, 'Super Cable');
INSERT INTO plch_parts
VALUES (1001, 'USB17 Port');
INSERT INTO plch_parts
VALUES (1002, 'Bluetoothy Thing');
COMMIT;
END;
1 row(s) inserted.
Define Collection Type in Package Specification
CREATE OR REPLACE PACKAGE plch_pkg AUTHID DEFINER
IS
TYPE array_t IS TABLE OF plch_parts.partname%TYPE
INDEX BY PLS_INTEGER;
END;
Package created.
How many elements left in the collection at the end?
DECLARE
l_partnames plch_pkg.array_t;
CURSOR parts_cur
IS
SELECT partname
FROM plch_parts
ORDER BY partnum;
BEGIN
OPEN parts_cur;
LOOP
FETCH parts_cur BULK COLLECT INTO l_partnames LIMIT 2;
EXIT WHEN parts_cur%NOTFOUND;
END LOOP;
DBMS_OUTPUT.put_line ('Count='||l_partnames.COUNT);
CLOSE parts_cur;
END;
Count=0
Copying Most Recent Fetched Rows to Cumulative Array
DECLARE
l_partnames1 plch_pkg.array_t;
l_partnames2 plch_pkg.array_t;
CURSOR parts_cur
IS
SELECT partname
FROM plch_parts
ORDER BY partnum;
BEGIN
OPEN parts_cur;
LOOP
FETCH parts_cur BULK COLLECT INTO l_partnames1 LIMIT 2;
FOR indx IN 1 .. l_partnames1.COUNT
LOOP
l_partnames2 (l_partnames2.COUNT + 1) := l_partnames1 (indx);
END LOOP;
EXIT WHEN parts_cur%NOTFOUND;
END LOOP;
DBMS_OUTPUT.put_line ('Count='||l_partnames2.COUNT);
CLOSE parts_cur;
END;
Count=8
An Unlimited Fetch Inside a Loop? Huh?
DECLARE
l_partnames plch_pkg.array_t;
l_count INTEGER;
CURSOR parts_cur
IS
SELECT partname
FROM plch_parts
ORDER BY partnum;
BEGIN
SELECT COUNT (*) INTO l_count FROM plch_parts;
OPEN parts_cur;
LOOP
FETCH parts_cur BULK COLLECT INTO l_partnames;
EXIT WHEN l_partnames.COUNT = l_count;
END LOOP;
DBMS_OUTPUT.put_line ('Count='||l_partnames.COUNT);
CLOSE parts_cur;
END;
Count=8
Short and Sweet
DECLARE
l_partnames plch_pkg.array_t;
BEGIN
SELECT partname
BULK COLLECT INTO l_partnames
FROM plch_parts
ORDER BY partnum;
DBMS_OUTPUT.put_line ('Count='||l_partnames.COUNT);
END;
Count=8
DROP TABLE plch_parts
Table dropped.
DROP PACKAGE plch_pkg
Package dropped.