COLLECTIONS
Collections
are also composite types, in that they allow you to treat several
variables as a unit. A collection combines variables of the same
type.
TYPES
- Varrays
- Nested tables
- Index - by tables
VARRAYS
A
varray is datatype very similar to an array. A varray has a fixed
limit on its size, specified as part of the declaration. Elements are
inserted into varray starting at index 1, up to maximum lenth
declared in the varray type. The maximum size of the varray is 2 giga
bytes.
Syntax:
Type
<type_name>
is
varray | varying array (<limit>)
of <element_type>;
Ex1:
DECLARE
type
t is varray(10) of varchar(2);
va
t := t('a','b','c','d');
flag
boolean;
BEGIN
dbms_output.put_line('Limit
= ' || va.limit);
dbms_output.put_line('Count
= ' || va.count);
dbms_output.put_line('First
Index = ' || va.first);
dbms_output.put_line('Last
Index = ' || va.last);
dbms_output.put_line('Next
Index = ' || va.next(2));
dbms_output.put_line('Previous
Index = ' || va.prior(3));
dbms_output.put_line('VARRAY
ELEMENTS');
for
i in va.first..va.last loop
dbms_output.put_line('va['
|| i || '] = ' || va(i));
end
loop;
flag
:= va.exists(3);
if
flag = true then
dbms_output.put_line('Index
3 exists with an element ' || va(3));
else
dbms_output.put_line('Index
3 does not exists');
end
if;
va.extend;
dbms_output.put_line('After
extend of one index, Count = ' || va.count);
flag
:= va.exists(5);
if
flag = true then
dbms_output.put_line('Index
5 exists with an element ' || va(5));
else
dbms_output.put_line('Index
5 does not exists');
end
if;
flag
:= va.exists(6);
if
flag = true then
dbms_output.put_line('Index
6 exists with an element ' || va(6));
else
dbms_output.put_line('Index
6 does not exists');
end
if;
va.extend(2);
dbms_output.put_line('After
extend of two indexes, Count = ' || va.count);
dbms_output.put_line('VARRAY
ELEMENTS');
for
i in va.first..va.last loop
dbms_output.put_line('va['
|| i || '] = ' || va(i));
end
loop;
va(5)
:= 'e';
va(6)
:= 'f';
va(7)
:= 'g';
dbms_output.put_line('AFTER
ASSINGNING VALUES TO EXTENDED ELEMENTS,
VARRAY
ELEMENTS');
for
i in va.first..va.last loop
dbms_output.put_line('va['
|| i || '] = ' || va(i));
end
loop;
va.extend(3,2);
dbms_output.put_line('After
extend of three indexes, Count = ' || va.count);
dbms_output.put_line('VARRAY
ELEMENTS');
for
i in va.first..va.last loop
dbms_output.put_line('va['
|| i || '] = ' || va(i));
end
loop;
va.trim;
dbms_output.put_line('After
trim of one index, Count = ' || va.count);
va.trim(3);
dbms_output.put_line('After
trim of three indexs, Count = ' || va.count);
dbms_output.put_line('AFTER
TRIM, VARRAY ELEMENTS');
for
i in va.first..va.last loop
dbms_output.put_line('va['
|| i || '] = ' || va(i));
end
loop;
va.delete;
dbms_output.put_line('After
delete of entire varray, Count = ' || va.count);
END;
Output:
Limit
= 10
Count
= 4
First
Index = 1
Last
Index = 4
Next
Index = 3
Previous
Index = 2
VARRAY
ELEMENTS
va[1]
= a
va[2]
= b
va[3]
= c
va[4]
= d
Index
3 exists with an element c
After
extend of one index, Count = 5
Index
5 exists with an element
Index
6 does not exists
After
extend of two indexes, Count = 7
VARRAY
ELEMENTS
va[1]
= a
va[2]
= b
va[3]
= c
va[4]
= d
va[5]
=
va[6]
=
va[7]
=
AFTER
ASSINGNING VALUES TO EXTENDED ELEMENTS, VARRAY ELEMENTS
va[1]
= a
va[2]
= b
va[3]
= c
va[4]
= d
va[5]
= e
va[6]
= f
va[7]
= g
After
extend of three indexes, Count = 10
VARRAY
ELEMENTS
va[1]
= a
va[2]
= b
va[3]
= c
va[4]
= d
va[5]
= e
va[6]
= f
va[7]
= g
va[8]
= b
va[9]
= b
va[10]
= b
After
trim of one index, Count = 9
After
trim of three indexs, Count = 6
AFTER
TRIM, VARRAY ELEMENTS
va[1]
= a
va[2]
= b
va[3]
= c
va[4]
= d
va[5]
= e
va[6]
= f
After
delete of entire varray, Count = 0
Ex2:
DECLARE
type
t is varray(4) of student%rowtype;
va
t := t(null,null,null,null);
BEGIN
for
i in 1..va.count loop
select
* into va(i) from student where sno = i;
dbms_output.put_line('Sno
= ' || va(i).sno || ' Sname = ' || va(i).sname);
end
loop;
END;
Output:
Sno
= 1 Sname = saketh
Sno
= 2 Sname = srinu
Sno
= 3 Sname = divya
Sno
= 4 Sname = manogni
Ex3:
DECLARE
type
t is varray(4) of student.smarks%type;
va
t := t(null,null,null,null);
BEGIN
for
i in 1..va.count loop
select
smarks into va(i) from student where sno = i;
dbms_output.put_line('Smarks
= ' || va(i));
end
loop;
END;
Output:
Smarks
= 100
Smarks
= 200
Smarks
= 300
Smarks
= 400
Ex4:
DECLARE
type
r is record(c1 student.sname%type,c2 student.smarks%type);
type
t is varray(4) of r;
va
t := t(null,null,null,null);
BEGIN
for
i in 1..va.count loop
select
sname,smarks into va(i) from student where sno = i;
dbms_output.put_line('Sname
= ' || va(i).c1 || ' Smarks = ' || va(i).c2);
end
loop;
END;
Output:
Sname
= saketh Smarks = 100
Sname
= srinu Smarks = 200
Sname
= divya Smarks = 300
Sname
= manogni Smarks = 400
Ex5:
DECLARE
type
t is varray(1) of addr;
va
t := t(null);
cursor
c is select * from employ;
i
number := 1;
BEGIN
for
v in c loop
select
address into va(i) from employ where ename = v.ename;
dbms_output.put_line('Hno
= ' || va(i).hno || ' City = ' || va(i).city);
end
loop;
END;
Output:
Hno
= 11 City = hyd
Hno
= 22 City = bang
Hno
= 33 City = kochi
Ex6:
DECLARE
type
t is varray(5) of varchar(2);
va1
t;
va2
t := t();
BEGIN
if
va1 is null then
dbms_output.put_line('va1
is null');
else
dbms_output.put_line('va1
is not null');
end
if;
if
va2 is null then
dbms_output.put_line('va2
is null');
else
dbms_output.put_line('va2
is not null');
end
if;
END;
Output:
va1
is null
va2
is not null
NESTED
TABLES
A
nested table is thought of a database table which has no limit on its
size. Elements are inserted into nested table starting at index 1.
The maximum size of the varray is 2 giga bytes.
Syntax:
Type
<type_name>
is
table of <table_type>;
Ex1:
DECLARE
type
t is table of varchar(2);
nt
t := t('a','b','c','d');
flag
boolean;
BEGIN
if
nt.limit is null then
dbms_output.put_line('No
limit to Nested Tables');
else
dbms_output.put_line('Limit
= ' || nt.limit);
end
if;
dbms_output.put_line('Count
= ' || nt.count);
dbms_output.put_line('First
Index = ' || nt.first);
dbms_output.put_line('Last
Index = ' || nt.last);
dbms_output.put_line('Next
Index = ' || nt.next(2));
dbms_output.put_line('Previous
Index = ' || nt.prior(3));
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
flag
:= nt.exists(3);
if
flag = true then
dbms_output.put_line('Index
3 exists with an element ' || nt(3));
else
dbms_output.put_line('Index
3 does not exists');
end
if;
nt.extend;
dbms_output.put_line('After
extend of one index, Count = ' || nt.count);
flag
:= nt.exists(5);
if
flag = true then
dbms_output.put_line('Index
5 exists with an element ' || nt(5));
else
dbms_output.put_line('Index
5 does not exists');
end
if;
flag
:= nt.exists(6);
if
flag = true then
dbms_output.put_line('Index
6 exists with an element ' || nt(6));
else
dbms_output.put_line('Index
6 does not exists');
end
if;
nt.extend(2);
dbms_output.put_line('After
extend of two indexes, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
nt(5)
:= 'e';
nt(6)
:= 'f';
nt(7)
:= 'g';
dbms_output.put_line('AFTER
ASSINGNING VALUES TO EXTENDED ELEMENTS, NESTED TABLE
ELEMENTS');
for
i in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
nt.extend(5,2);
dbms_output.put_line('After
extend of five indexes, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
nt.trim;
dbms_output.put_line('After
trim of one index, Count = ' || nt.count);
nt.trim(3);
dbms_output.put_line('After
trim of three indexs, Count = ' || nt.count);
dbms_output.put_line('AFTER
TRIM, NESTED TABLE ELEMENTS');
for
i in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
nt.delete(1);
dbms_output.put_line('After
delete of first index, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 2..nt.count+1 loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
nt.delete(4);
dbms_output.put_line('After
delete of fourth index, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 2..3 loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
for
i in 5..nt.count+2 loop
dbms_output.put_line('nt['
|| i || '] = ' || nt(i));
end
loop;
nt.delete;
dbms_output.put_line('After
delete of entire nested table, Count = ' || nt.count);
END;
Output:
No
limit to Nested Tables
Count
= 4
First
Index = 1
Last
Index = 4
Next
Index = 3
Previous
Index = 2
NESTED
TABLE ELEMENTS
nt[1]
= a
nt[2]
= b
nt[3]
= c
nt[4]
= d
Index
3 exists with an element c
After
extend of one index, Count = 5
Index
5 exists with an element
Index
6 does not exists
After
extend of two indexes, Count = 7
NESTED
TABLE ELEMENTS
nt[1]
= a
nt[2]
= b
nt[3]
= c
nt[4]
= d
nt[5]
=
nt[6]
=
nt[7]
=
AFTER
ASSINGNING VALUES TO EXTENDED ELEMENTS, NESTED TABLE ELEMENTS
nt[1]
= a
nt[2]
= b
nt[3]
= c
nt[4]
= d
nt[5]
= e
nt[6]
= f
nt[7]
= g
After
extend of five indexes, Count = 12
NESTED
TABLE ELEMENTS
nt[1]
= a
nt[2]
= b
nt[3]
= c
nt[4]
= d
nt[5]
= e
nt[6]
= f
nt[7]
= g
nt[8]
= b
nt[9]
= b
nt[10]
= b
nt[11]
= b
nt[12]
= b
After
trim of one index, Count = 11
After
trim of three indexs, Count = 8
AFTER
TRIM, NESTED TABLE ELEMENTS
nt[1]
= a
nt[2]
= b
nt[3]
= c
nt[4]
= d
nt[5]
= e
nt[6]
= f
nt[7]
= g
nt[8]
= b
After
delete of first index, Count = 7
NESTED
TABLE ELEMENTS
nt[2]
= b
nt[3]
= c
nt[4]
= d
nt[5]
= e
nt[6]
= f
nt[7]
= g
nt[8]
= b
After
delete of fourth index, Count = 6
NESTED
TABLE ELEMENTS
nt[2]
= b
nt[3]
= c
nt[5]
= e
nt[6]
= f
nt[7]
= g
nt[8]
= b
After
delete of entire nested table, Count = 0
Ex2:
DECLARE
type
t is table of student%rowtype;
nt
t := t(null,null,null,null);
BEGIN
for
i in 1..nt.count loop
select
* into nt(i) from student where sno = i;
dbms_output.put_line('Sno
= ' || nt(i).sno || ' Sname = ' || nt(i).sname);
end
loop;
END;
Output:
Sno
= 1 Sname = saketh
Sno
= 2 Sname = srinu
Sno
= 3 Sname = divya
Sno
= 4 Sname = manogni
Ex3:
DECLARE
type
t is table of student.smarks%type;
nt
t := t(null,null,null,null);
BEGIN
for
i in 1..nt.count loop
select
smarks into nt(i) from student where sno = i;
dbms_output.put_line('Smarks
= ' || nt(i));
end
loop;
END;
Output:
Smarks
= 100
Smarks
= 200
Smarks
= 300
Smarks
= 400
Ex4:
DECLARE
type
r is record(c1 student.sname%type,c2 student.smarks%type);
type
t is table of r;
nt
t := t(null,null,null,null);
BEGIN
for
i in 1..nt.count loop
select
sname,smarks into nt(i) from student where sno = i;
dbms_output.put_line('Sname
= ' || nt(i).c1 || ' Smarks = ' || nt(i).c2);
end
loop;
END;
Output:
Sname
= saketh Smarks = 100
Sname
= srinu Smarks = 200
Sname
= divya Smarks = 300
Sname
= manogni Smarks = 400
Ex5:
DECLARE
type
t is table of addr;
nt
t := t(null);
cursor
c is select * from employ;
i
number := 1;
BEGIN
for
v in c loop
select
address into nt(i) from employ where ename = v.ename;
dbms_output.put_line('Hno
= ' || nt(i).hno || ' City = ' || nt(i).city);
end
loop;
END;
Output:
Hno
= 11 City = hyd
Hno
= 22 City = bang
Hno
= 33 City = kochi
Ex6:
DECLARE
type
t is varray(5) of varchar(2);
nt1
t;
nt2
t := t();
BEGIN
if
nt1 is null then
dbms_output.put_line('nt1
is null');
else
dbms_output.put_line('nt1
is not null');
end
if;
if
nt2 is null then
dbms_output.put_line('nt2
is null');
else
dbms_output.put_line('nt2
is not null');
end
if;
END;
Output:
nt1
is null
nt2
is not null
INDEX-BY
TABLES
An
index-by table has no limit on its size. Elements are inserted into
index-by table whose index may start non-sequentially including
negative integers.
Syntax:
Type
<type_name>
is
table of <table_type>
index
by binary_integer;
Ex:
DECLARE
type
t is table of varchar(2) index by binary_integer;
ibt
t;
flag
boolean;
BEGIN
ibt(1)
:= 'a';
ibt(-20)
:= 'b';
ibt(30)
:= 'c';
ibt(100)
:= 'd';
if
ibt.limit is null then
dbms_output.put_line('No
limit to Index by Tables');
else
dbms_output.put_line('Limit
= ' || ibt.limit);
end
if;
dbms_output.put_line('Count
= ' || ibt.count);
dbms_output.put_line('First
Index = ' || ibt.first);
dbms_output.put_line('Last
Index = ' || ibt.last);
dbms_output.put_line('Next
Index = ' || ibt.next(2));
dbms_output.put_line('Previous
Index = ' || ibt.prior(3));
dbms_output.put_line('INDEX
BY TABLE ELEMENTS');
dbms_output.put_line('ibt[-20]
= ' || ibt(-20));
dbms_output.put_line('ibt[1]
= ' || ibt(1));
dbms_output.put_line('ibt[30]
= ' || ibt(30));
dbms_output.put_line('ibt[100]
= ' || ibt(100));
flag
:= ibt.exists(30);
if
flag = true then
dbms_output.put_line('Index
30 exists with an element ' || ibt(30));
else
dbms_output.put_line('Index
30 does not exists');
end
if;
flag
:= ibt.exists(50);
if
flag = true then
dbms_output.put_line('Index
50 exists with an element ' || ibt(30));
else
dbms_output.put_line('Index
50 does not exists');
end
if;
ibt.delete(1);
dbms_output.put_line('After
delete of first index, Count = ' || ibt.count);
ibt.delete(30);
dbms_output.put_line('After
delete of index thirty, Count = ' || ibt.count);
dbms_output.put_line('INDEX
BY TABLE ELEMENTS');
dbms_output.put_line('ibt[-20]
= ' || ibt(-20));
dbms_output.put_line('ibt[100]
= ' || ibt(100));
ibt.delete;
dbms_output.put_line('After
delete of entire index-by table, Count = ' || ibt.count);
END;
Output:
No
limit to Index by Tables
Count
= 4
First
Index = -20
Last
Index = 100
Next
Index = 30
Previous
Index = 1
INDEX
BY TABLE ELEMENTS
ibt[-20]
= b
ibt[1]
= a
ibt[30]
= c
ibt[100]
= d
Index
30 exists with an element c
Index
50 does not exists
After
delete of first index, Count = 3
After
delete of index thirty, Count = 2
INDEX
BY TABLE ELEMENTS
ibt[-20]
= b
ibt[100]
= d
After
delete of entire index-by table, Count = 0
DIFFERENCES
AMONG COLLECTIONS
- Varrays has limit, nested tables and index-by tables has no limit.
- Varrays and nested tables must be initialized before assignment of elements, in index-by tables we can directly assign elements.
- Varrays and nested tables stored in database, but index-by tables can not.
- Nested tables and index-by tables are PL/SQL tables, but varrays can not.
- Keys must be positive in case of nested tables and varrays, in case of index-by tables keys can be positive or negative.
- Referencing nonexistent elements raises SUBSCRIPT_BEYOND_COUNT in both nested tables and varrays, but in case of index-by tables NO_DATA_FOUND raises.
- Keys are sequential in both nested tables and varrays, non-sequential in index-by tables.
- Individual indexes can be deleted in both nested tables and index-by tables, but in varrays can not.
- Individual indexes can be trimmed in both nested tables and varrays, but in index-by tables can not.
- Individual indexes can be extended in both nested tables and varrays, but in index-by tables can not.
MULTILEVEL
COLLECTIONS
Collections
of more than one dimension which is a collection of collections,
known as multilevel collections.
Syntax:
Type
<type_name1>
is
table of <table_type>
index
by binary_integer;
Type
<type_name2>
is
varray(<limit>)
| table | of <type_name1>
| index
by
binary_integer;
Ex1:
DECLARE
type
t1 is table of varchar(2) index by binary_integer;
type
t2 is varray(5) of t1;
va
t2 := t2();
c
number := 97;
flag
boolean;
BEGIN
va.extend(4);
dbms_output.put_line('Count
= ' || va.count);
dbms_output.put_line('Limit
= ' || va.limit);
for
i in 1..va.count loop
for
j in 1..va.count loop
va(i)(j)
:= chr(c);
c
:= c + 1;
end
loop;
end
loop;
dbms_output.put_line('VARRAY
ELEMENTS');
for
i in 1..va.count loop
for
j in 1..va.count loop
dbms_output.put_line('va['
|| i || '][' || j || '] = ' || va(i)(j));
end
loop;
end
loop;
dbms_output.put_line('First
index = ' || va.first);
dbms_output.put_line('Last
index = ' || va.last);
dbms_output.put_line('Next
index = ' || va.next(2));
dbms_output.put_line('Previous
index = ' || va.prior(3));
flag
:= va.exists(2);
if
flag = true then
dbms_output.put_line('Index
2 exists');
else
dbms_output.put_line('Index
2 exists');
end
if;
va.extend;
va(1)(5)
:= 'q';
va(2)(5)
:= 'r';
va(3)(5)
:= 's';
va(4)(5)
:= 't';
va(5)(1)
:= 'u';
va(5)(2)
:= 'v';
va(5)(3)
:= 'w';
va(5)(4)
:= 'x';
va(5)(5)
:= 'y';
dbms_output.put_line('After
extend of one index, Count = ' || va.count);
dbms_output.put_line('VARRAY
ELEMENTS');
for
i in 1..va.count loop
for
j in 1..va.count loop
dbms_output.put_line('va['
|| i || '][' || j || '] = ' || va(i)(j));
end
loop;
end
loop;
va.trim;
dbms_output.put_line('After
trim of one index, Count = ' || va.count);
va.trim(2);
dbms_output.put_line('After
trim of two indexes, Count = ' || va.count);
dbms_output.put_line('VARRAY
ELEMENTS');
for
i in 1..va.count loop
for
j in 1..va.count loop
dbms_output.put_line('va['
|| i || '][' || j || '] = ' || va(i)(j));
end
loop;
end
loop;
va.delete;
dbms_output.put_line('After
delete of entire varray, Count = ' || va.count);
END;
Output:
Count
= 4
Limit
= 5
VARRAY
ELEMENTS
va[1][1]
= a
va[1][2]
= b
va[1][3]
= c
va[1][4]
= d
va[2][1]
= e
va[2][2]
= f
va[2][3]
= g
va[2][4]
= h
va[3][1]
= i
va[3][2]
= j
va[3][3]
= k
va[3][4]
= l
va[4][1]
= m
va[4][2]
= n
va[4][3]
= o
va[4][4]
= p
First
index = 1
Last
index = 4
Next
index = 3
Previous
index = 2
Index
2 exists
After
extend of one index, Count = 5
VARRAY
ELEMENTS
va[1][1]
= a
va[1][2]
= b
va[1][3]
= c
va[1][4]
= d
va[1][5]
= q
va[2][1]
= e
va[2][2]
= f
va[2][3]
= g
va[2][4]
= h
va[2][5]
= r
va[3][1]
= i
va[3][2]
= j
va[3][3]
= k
va[3][4]
= l
va[3][5]
= s
va[4][1]
= m
va[4][2]
= n
va[4][3]
= o
va[4][4]
= p
va[4][5]
= t
va[5][1]
= u
va[5][2]
= v
va[5][3]
= w
va[5][4]
= x
va[5][5]
= y
After
trim of one index, Count = 4
After
trim of two indexes, Count = 2
VARRAY
ELEMENTS
va[1][1]
= a
va[1][2]
= b
va[2][1]
= e
va[2][2]
= f
After
delete of entire varray, Count = 0
Ex2:
DECLARE
type
t1 is table of varchar(2) index by binary_integer;
type
t2 is table of t1;
nt
t2 := t2();
c
number := 65;
v
number := 1;
flag
boolean;
BEGIN
nt.extend(4);
dbms_output.put_line('Count
= ' || nt.count);
if
nt.limit is null then
dbms_output.put_line('No
limit to Nested Tables');
else
dbms_output.put_line('Limit
= ' || nt.limit);
end
if;
for
i in 1..nt.count loop
for
j in 1..nt.count loop
nt(i)(j)
:= chr(c);
c
:= c + 1;
if
c = 91 then
c
:= 97;
end
if;
end
loop;
end
loop;
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
for
j in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '][' || j || '] = ' || nt(i)(j));
end
loop;
end
loop;
dbms_output.put_line('First
index = ' || nt.first);
dbms_output.put_line('Last
index = ' || nt.last);
dbms_output.put_line('Next
index = ' || nt.next(2));
dbms_output.put_line('Previous
index = ' || nt.prior(3));
flag
:= nt.exists(2);
if
flag = true then
dbms_output.put_line('Index
2 exists');
else
dbms_output.put_line('Index
2 exists');
end
if;
nt.extend(2);
nt(1)(5)
:= 'Q';
nt(1)(6)
:= 'R';
nt(2)(5)
:= 'S';
nt(2)(6)
:= 'T';
nt(3)(5)
:= 'U';
nt(3)(6)
:= 'V';
nt(4)(5)
:= 'W';
nt(4)(6)
:= 'X';
nt(5)(1)
:= 'Y';
nt(5)(2)
:= 'Z';
nt(5)(3)
:= 'a';
nt(5)(4)
:= 'b';
nt(5)(5)
:= 'c';
nt(5)(6)
:= 'd';
nt(6)(1)
:= 'e';
nt(6)(2)
:= 'f';
nt(6)(3)
:= 'g';
nt(6)(4)
:= 'h';
nt(6)(5)
:= 'i';
nt(6)(6)
:= 'j';
dbms_output.put_line('After
extend of one index, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
for
j in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '][' || j || '] = ' || nt(i)(j));
end
loop;
end
loop;
nt.trim;
dbms_output.put_line('After
trim of one indexe, Count = ' || nt.count);
nt.trim(2);
dbms_output.put_line('After
trim of two indexes, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
for
j in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '][' || j || '] = ' || nt(i)(j));
end
loop;
end
loop;
nt.delete(2);
dbms_output.put_line('After
delete of second index, Count = ' || nt.count);
dbms_output.put_line('NESTED
TABLE ELEMENTS');
loop
exit
when v = 4;
for
j in 1..nt.count+1 loop
dbms_output.put_line('nt['
|| v || '][' || j || '] = ' || nt(v)(j));
end
loop;
v
:= v + 1;
if
v= 2 then
v
:= 3;
end
if;
end
loop;
nt.delete;
dbms_output.put_line('After
delete of entire nested table, Count = ' || nt.count);
END;
Output:
Count
= 4
No
limit to Nested Tables
NESTED
TABLE ELEMENTS
nt[1][1]
= A
nt[1][2]
= B
nt[1][3]
= C
nt[1][4]
= D
nt[2][1]
= E
nt[2][2]
= F
nt[2][3]
= G
nt[2][4]
= H
nt[3][1]
= I
nt[3][2]
= J
nt[3][3]
= K
nt[3][4]
= L
nt[4][1]
= M
nt[4][2]
= N
nt[4][3]
= O
nt[4][4]
= P
First
index = 1
Last
index = 4
Next
index = 3
Previous
index = 2
Index
2 exists
After
extend of one index, Count = 6
NESTED
TABLE ELEMENTS
nt[1][1]
= A
nt[1][2]
= B
nt[1][3]
= C
nt[1][4]
= D
nt[1][5]
= Q
nt[1][6]
= R
nt[2][1]
= E
nt[2][2]
= F
nt[2][3]
= G
nt[2][4]
= H
nt[2][5]
= S
nt[2][6]
= T
nt[3][1]
= I
nt[3][2]
= J
nt[3][3]
= K
nt[3][4]
= L
nt[3][5]
= U
nt[3][6]
= V
nt[4][1]
= M
nt[4][2]
= N
nt[4][3]
= O
nt[4][4]
= P
nt[4][5]
= W
nt[4][6]
= X
nt[5][1]
= Y
nt[5][2]
= Z
nt[5][3]
= a
nt[5][4]
= b
nt[5][5]
= c
nt[5][6]
= d
nt[6][1]
= e
nt[6][2]
= f
nt[6][3]
= g
nt[6][4]
= h
nt[6][5]
= i
nt[6][6]
= j
After
trim of one indexe, Count = 5
After
trim of two indexes, Count = 3
NESTED
TABLE ELEMENTS
nt[1][1]
= A
nt[1][2]
= B
nt[1][3]
= C
nt[2][1]
= E
nt[2][2]
= F
nt[2][3]
= G
nt[3][1]
= I
nt[3][2]
= J
nt[3][3]
= K
After
delete of second index, Count = 2
NESTED
TABLE ELEMENTS
nt[1][1]
= A
nt[1][2]
= B
nt[1][3]
= C
nt[3][1]
= I
nt[3][2]
= J
nt[3][3]
= K
After
delete of entire nested table, Count = 0
Ex3:
DECLARE
type
t1 is table of varchar(2) index by binary_integer;
type
t2 is table of t1 index by binary_integer;
ibt
t2;
flag
boolean;
BEGIN
dbms_output.put_line('Count
= ' || ibt.count);
if
ibt.limit is null then
dbms_output.put_line('No
limit to Index-by Tables');
else
dbms_output.put_line('Limit
= ' || ibt.limit);
end
if;
ibt(1)(1)
:= 'a';
ibt(4)(5)
:= 'b';
ibt(5)(1)
:= 'c';
ibt(6)(2)
:= 'd';
ibt(8)(3)
:= 'e';
ibt(3)(4)
:= 'f';
dbms_output.put_line('INDEX-BY
TABLE ELEMENTS');
dbms_output.put_line('ibt([1][1]
= ' || ibt(1)(1));
dbms_output.put_line('ibt([4][5]
= ' || ibt(4)(5));
dbms_output.put_line('ibt([5][1]
= ' || ibt(5)(1));
dbms_output.put_line('ibt([6][2]
= ' || ibt(6)(2));
dbms_output.put_line('ibt([8][3]
= ' || ibt(8)(3));
dbms_output.put_line('ibt([3][4]
= ' || ibt(3)(4));
dbms_output.put_line('First
Index = ' || ibt.first);
dbms_output.put_line('Last
Index = ' || ibt.last);
dbms_output.put_line('Next
Index = ' || ibt.next(3));
dbms_output.put_line('Prior
Index = ' || ibt.prior(8));
ibt(1)(2)
:= 'g';
ibt(1)(3)
:= 'h';
ibt(1)(4)
:= 'i';
ibt(1)(5)
:= 'k';
ibt(1)(6)
:= 'l';
ibt(1)(7)
:= 'm';
ibt(1)(8)
:= 'n';
dbms_output.put_line('Count
= ' || ibt.count);
dbms_output.put_line('INDEX-BY
TABLE ELEMENTS');
for
i in 1..8 loop
dbms_output.put_line('ibt[1]['
|| i || '] = ' || ibt(1)(i));
end
loop;
dbms_output.put_line('ibt([4][5]
= ' || ibt(4)(5));
dbms_output.put_line('ibt([5][1]
= ' || ibt(5)(1));
dbms_output.put_line('ibt([6][2]
= ' || ibt(6)(2));
dbms_output.put_line('ibt([8][3]
= ' || ibt(8)(3));
dbms_output.put_line('ibt([3][4]
= ' || ibt(3)(4));
flag
:= ibt.exists(3);
if
flag = true then
dbms_output.put_line('Index
3 exists');
else
dbms_output.put_line('Index
3 exists');
end
if;
ibt.delete(1);
dbms_output.put_line('After
delete of first index, Count = ' || ibt.count);
ibt.delete(4);
dbms_output.put_line('After
delete of fourth index, Count = ' || ibt.count);
dbms_output.put_line('INDEX-BY
TABLE ELEMENTS');
dbms_output.put_line('ibt([5][1]
= ' || ibt(5)(1));
dbms_output.put_line('ibt([6][2]
= ' || ibt(6)(2));
dbms_output.put_line('ibt([8][3]
= ' || ibt(8)(3));
dbms_output.put_line('ibt([3][4]
= ' || ibt(3)(4));
ibt.delete;
dbms_output.put_line('After
delete of entire index-by table, Count = ' || ibt.count);
END;
Output:
Count
= 0
No
limit to Index-by Tables
INDEX-BY
TABLE ELEMENTS
ibt([1][1]
= a
ibt([4][5]
= b
ibt([5][1]
= c
ibt([6][2]
= d
ibt([8][3]
= e
ibt([3][4]
= f
First
Index = 1
Last
Index = 8
Next
Index = 4
Prior
Index = 6
Count
= 6
INDEX-BY
TABLE ELEMENTS
ibt[1][1]
= a
ibt[1][2]
= g
ibt[1][3]
= h
ibt[1][4]
= i
ibt[1][5]
= k
ibt[1][6]
= l
ibt[1][7]
= m
ibt[1][8]
= n
ibt([4][5]
= b
ibt([5][1]
= c
ibt([6][2]
= d
ibt([8][3]
= e
ibt([3][4]
= f
Index
3 exists
After
delete of first index, Count = 5
After
delete of fourth index, Count = 4
INDEX-BY
TABLE ELEMENTS
ibt([5][1]
= c
ibt([6][2]
= d
ibt([8][3]
= e
ibt([3][4]
= f
After
delete of entire index-by table, Count = 0
Ex3:
DECLARE
type
t1 is table of varchar(2) index by binary_integer;
type
t2 is table of t1 index by binary_integer;
type
t3 is table of t2;
nt
t3 := t3();
c
number := 65;
BEGIN
nt.extend(2);
dbms_output.put_line('Count
= ' || nt.count);
for
i in 1..nt.count loop
for
j in 1..nt.count loop
for
k in 1..nt.count loop
nt(i)(j)(k)
:= chr(c);
c
:= c + 1;
end
loop;
end
loop;
end
loop;
dbms_output.put_line('NESTED
TABLE ELEMENTS');
for
i in 1..nt.count loop
for
j in 1..nt.count loop
for
k in 1..nt.count loop
dbms_output.put_line('nt['
|| i || '][' || j || '][' || k || '] = ' ||
nt(i)(j)(k));
end
loop;
end
loop;
end
loop;
END;
Output:
Count
= 2
NESTED
TABLE ELEMENTS
nt[1][1][1]
= A
nt[1][1][2]
= B
nt[1][2][1]
= C
nt[1][2][2]
= D
nt[2][1][1]
= E
nt[2][1][2]
= F
nt[2][2][1]
= G
nt[2][2][2]
= H
OBJECTS
USED IN THE EXAMPLES
SQL>
select
* from student;
SNO
SNAME SMARKS
----------
-------------- ----------
1
saketh 100
2
srinu 200
3
divya 300
4
manogni 400
SQL>
create or replace type addr as object(hno number(2),city
varchar(10));/
SQL>
select * from employ;
ENAME
JOB ADDRESS(HNO, CITY)
----------
---------- -----------------------------
Ranjit
clerk ADDR(11, 'hyd')
Satish
manager ADDR(22, 'bang')
Srinu
engineer ADDR(33, 'kochi')
No comments:
Post a Comment