A Collection of Records
CREATE OR REPLACE PACKAGE aa_pkg AUTHID DEFINER
IS
TYPE record_t IS RECORD
(nm VARCHAR2 (100), sal NUMBER);
TYPE array_t IS TABLE OF record_t INDEX BY PLS_INTEGER;
FUNCTION my_array RETURN array_t;
END;
Package created.
Populate An Array for Easy Testing
CREATE OR REPLACE PACKAGE BODY aa_pkg
IS
FUNCTION my_array
RETURN array_t
IS
l_return array_t;
BEGIN
l_return (1).nm := 'Me';
l_return (1).sal := 1000;
l_return (200).nm := 'You';
l_return (200).sal := 2;
RETURN l_return;
END;
END;
Package Body created.
Yes, Use TABLE with Associative Arrays of Records!
DECLARE
l_array aa_pkg.array_t;
BEGIN
l_array := aa_pkg.my_array;
FOR rec IN ( SELECT * FROM TABLE (l_array) ORDER BY nm)
LOOP
DBMS_OUTPUT.put_line (rec.nm);
END LOOP;
END;
Me
You
Add Index Value to Record Type
CREATE OR REPLACE PACKAGE aa_pkg AUTHID DEFINER
IS
TYPE record_t IS RECORD
(
idx INTEGER,
nm VARCHAR2 (100),
sal NUMBER
);
TYPE array_t IS TABLE OF record_t INDEX BY PLS_INTEGER;
FUNCTION my_array RETURN array_t;
END;
Package created.
Same Package Body as Before
CREATE OR REPLACE PACKAGE BODY aa_pkg
IS
FUNCTION my_array RETURN array_t
IS
l_return array_t;
BEGIN
l_return (1).nm := 'Me';
l_return (1).sal := 1000;
l_return (-200).nm := 'You';
l_return (-200).sal := 2;
RETURN l_return;
END;
END;
Package Body created.
Add Index Value to Records, Use in Query
DECLARE
l_array aa_pkg.array_t;
l_index PLS_INTEGER;
BEGIN
l_array := aa_pkg.my_array;
l_index := l_array.FIRST;
WHILE l_index IS NOT NULL
LOOP
l_array (l_index).idx := l_index;
l_index := l_array.next (l_index);
END LOOP;
FOR rec IN ( SELECT * FROM TABLE (l_array) ORDER BY idx)
LOOP
DBMS_OUTPUT.put_line (rec.idx || ' = ' || rec.nm);
END LOOP;
END;
-200 = You
1 = Me