Quick examples into Oracle PL/SQL collections.
There are three types of Oracle Collections you can use in PL/SQL :
- Index-by-Tables : Unbounded, Hashes , Single Dimensional
- Nested-Tables : Unbounded, Array, unordered, Single dimension
- VARRAYS : Bounded, Single Dimension
Each one of these Types have its own features and limitations.
Most of them, share some common functions like EXTEND, FIRST, LAST, ..etc
These self-explaining examples; helps the reader get a first introduction into each collection type .
/*
--Index-by-Tables or PL/SQL Tables
--* Is atable of two columns, KEY and VALUE pairs.
--* The KEY is a Binary Integer.
--* The Value is whichever type you chose.
*/
-- an array of Intgers
declare
type t_Numbers IS TABLE OF INTEGER
INDEX BY BINARY_INTEGER;
v_Numbers t_Numbers;
v_limit Integer := 10;
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Example: 1' );
For v_Count IN 1..v_limit LOOP
v_Numbers(v_Count) := v_Count*10;
END LOOP;
For v_Count IN 1..v_limit LOOP
DBMS_OUTPUT.PUT_LINE ( v_Count||':'||v_Numbers(v_Count) );
END LOOP;
END;
-- an array of VarChars
declare
type t_Chars IS TABLE OF VARCHAR(100)
INDEX BY BINARY_INTEGER;
v_Chars t_Chars;
v_limit Integer := 10;
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Example: 2' );
For v_Count IN 1..v_limit LOOP
v_Chars(v_Count) := LPAD(to_char(v_Count),100-length(v_Count),'0');
END LOOP;
For v_Count IN 1..v_limit LOOP
DBMS_OUTPUT.PUT_LINE ( v_Count||':'||v_Chars(v_Count) );
END LOOP;
END;
-- an array of VarChars with static assignment
declare
type t_Chars IS TABLE OF VARCHAR(100)
INDEX BY BINARY_INTEGER;
v_Chars t_Chars;
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Example: 3' );
v_Chars(0) := 'SWITZERLAND';
v_Chars(1) := 'GERMANY';
v_Chars(2) := 'NETHERLANDS';
v_Chars(3) := 'USA';
v_Chars(4) := 'BRAZIL';
-- Using COUNT
For v_Count IN 0..v_Chars.COUNT-1 LOOP
DBMS_OUTPUT.PUT_LINE ( v_Count||':'||v_Chars(v_Count) );
END LOOP;
DBMS_OUTPUT.PUT_LINE ( ' ' );
v_Chars(5) := 'AUSTRIA';
--
-- Using FIRST and LAST
For v_Count IN v_Chars.FIRST..v_Chars.LAST LOOP
DBMS_OUTPUT.PUT_LINE ( v_Count||':'||v_Chars(v_Count) );
END LOOP;
END;
/*
--Nested Tables:
--Are like Index-By-Tables but:
--1) They can have non-sequential Key
--2) They don't have INDEX BY BINARY_INTEGER
*/
DECLARE
TYPE t_Numbers IS TABLE OF NUMBER;
v_Numbers t_Numbers := t_Numbers(-1,4,7,8,9);
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Example: 4' );
v_Numbers.EXTEND(1); -- adds one empty elements
v_Numbers(v_Numbers.COUNT) := 20; -- assigns 20 to the last element
For v_Count IN v_Numbers.FIRST..v_Numbers.LAST LOOP
DBMS_OUTPUT.PUT_LINE ( v_Count||':'||v_Numbers(v_Count) );
END LOOP;
DBMS_OUTPUT.PUT_LINE('-------------');
END;
/*
--VARRAYS:
-- has a fixed upper bound on its size on Initialization
*/
DECLARE
TYPE t_Numbers IS VARRAY(10) OF NUMBER;
v_Numbers t_Numbers := t_Numbers(-1,4,7,8,9,100,4,5,6); -- 9 elemets of 10 possible
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Example: 5' );
--v_Numbers.EXTEND(1); -- adds one empty elements
v_Numbers(v_Numbers.COUNT) := 20; -- assigns 20 to the last element
v_Numbers(v_Numbers.COUNT) := 21; -- assigns 20 to the last element ,which overrides the last element
For v_Count IN v_Numbers.FIRST..v_Numbers.LAST LOOP
DBMS_OUTPUT.PUT_LINE ( v_Count||':'||v_Numbers(v_Count) );
END LOOP;
DBMS_OUTPUT.PUT_LINE('-------------');
END;
/*
--Multilevel Collections:
--2 diemnsion collections
*/
declare
TYPE t_Chars IS TABLE OF VARCHAR(100) INDEX BY BINARY_INTEGER;
type t_Numbers IS TABLE OF t_Chars INDEX BY BINARY_INTEGER;
v_Chars t_Chars;
v_MultiNumbers t_Numbers;
v_sep varchar(5);
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Example: 6' );
--print the Header
DBMS_OUTPUT.PUT_LINE ( lpad('-',46,'-') );
FOR x IN 1..12 LOOP
For y IN 1..10 LOOP
v_MultiNumbers (x)(y) :=x*y;
END LOOP;
END LOOP;
DBMS_OUTPUT.PUT (lpad(0,3,'0')||' : ');
v_sep:=' ';
For y IN 1..10 LOOP
DBMS_OUTPUT.PUT ( v_sep||lpad(y,3,'0'));
v_sep:=',';
END LOOP;
DBMS_OUTPUT.PUT_LINE ( ' ' );
--print the Values
DBMS_OUTPUT.PUT_LINE ( lpad('-',46,'-') );
FOR x IN 1..12 LOOP
DBMS_OUTPUT.PUT (lpad(x,3,'0')||' : ');
v_sep:=' ';
For y IN 1..10 LOOP
DBMS_OUTPUT.PUT ( v_sep||lpad(v_MultiNumbers(x)(y),3,' ') );
v_sep:=',';
END LOOP;
DBMS_OUTPUT.PUT_LINE ( ' ' );
END LOOP;
END;
The output of the above statements will look like this:
Example: 1 1:10 2:20 3:30 4:40 5:50 6:60 7:70 8:80 9:90 10:100 Example: 2 1:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 2:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 3:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 4:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 5:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005 6:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 7:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007 8:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008 9:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009 10:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010 Example: 3 0:SWITZERLAND 1:GERMANY 2:NETHERLANDS 3:USA 4:BRAZIL 0:SWITZERLAND 1:GERMANY 2:NETHERLANDS 3:USA 4:BRAZIL 5:AUSTRIA Example: 4 1:-1 2:4 3:7 4:8 5:9 6:20 ------------- Example: 5 1:-1 2:4 3:7 4:8 5:9 6:100 7:4 8:5 9:21 ------------- Example: 6 ---------------------------------------------- 000 : 001,002,003,004,005,006,007,008,009,010 ---------------------------------------------- 001 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 002 : 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 003 : 3, 6, 9, 12, 15, 18, 21, 24, 27, 30 004 : 4, 8, 12, 16, 20, 24, 28, 32, 36, 40 005 : 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 006 : 6, 12, 18, 24, 30, 36, 42, 48, 54, 60 007 : 7, 14, 21, 28, 35, 42, 49, 56, 63, 70 008 : 8, 16, 24, 32, 40, 48, 56, 64, 72, 80 009 : 9, 18, 27, 36, 45, 54, 63, 72, 81, 90 010 : 10, 20, 30, 40, 50, 60, 70, 80, 90,100 011 : 11, 22, 33, 44, 55, 66, 77, 88, 99,110 012 : 12, 24, 36, 48, 60, 72, 84, 96,108,120