pl/sql表类似于单列数据库表,分为两种类型:联合数组(索引表)和嵌套表,两种类型之间的主要差别是:嵌套表可以存储在数据库列中,而联合数组不行
1.联合数组
联合数组的创建语法如下:
type type_name is table of element_type[not null]
index by element_type;
table_name type_name;
用法示例:
SQL> declare
2 cursor emp_empno is select empno from emp;
3 type empno_type is table of emp.empno%type
4 index by binary_integer;
5 empno_tab empno_type;
6 v_counter integer:=0;
7 begin
8 for i in emp_empno loop
9 v_counter:=v_counter+1;
10 empno_tab(v_counter):=i.empno;
11 dbms_output.put_line('empno('||v_counter||'):'||empno_tab(v_counter));
12 end loop;
13 end;
14 /
empno(1):7369
empno(2):7499
empno(3):7521
empno(4):7566
empno(5):7654
empno(6):7698
empno(7):7782
empno(8):7788
empno(9):7839
empno(10):7844
empno(11):7876
empno(12):7900
empno(13):7902
empno(14):7934
PL/SQL procedure successfully completed
2 cursor emp_empno is select empno from emp;
3 type empno_type is table of emp.empno%type
4 index by binary_integer;
5 empno_tab empno_type;
6 v_counter integer:=0;
7 begin
8 for i in emp_empno loop
9 v_counter:=v_counter+1;
10 empno_tab(v_counter):=i.empno;
11 dbms_output.put_line('empno('||v_counter||'):'||empno_tab(v_counter));
12 end loop;
13 end;
14 /
empno(1):7369
empno(2):7499
empno(3):7521
empno(4):7566
empno(5):7654
empno(6):7698
empno(7):7782
empno(8):7788
empno(9):7839
empno(10):7844
empno(11):7876
empno(12):7900
empno(13):7902
empno(14):7934
PL/SQL procedure successfully completed
以上例子中,以v_counter作为数组的下标并且使用emp表中的empno列填充联合数组的emp_tab。需要主要的是,如果饮用数组中不存在的数据行,则会抛出no_data_found异常。
2.嵌套表
嵌套表创建方法如下:
type type_name is table of element_type[not null];
table_name type_name;
注意:
引用嵌套表中元素时,必须先初始化。嵌套表在声明的时候被自动设置为null,不存在任何元素,必须使用与之同名的构造器进行初始化。
我在使用嵌套表的时候犯过一下错误:
1.嵌套表为初始化,集合为null
declare
cursor emp_name is select ename from emp;
type name_type is table of emp.ename%type;
name_tab name_type;
v_counter integer:=0;
begin
for i in emp_name loop
v_counter:=v_counter+1;
name_tab(v_counter):=i.ename;
dbms_output.put_line('name('||v_counter||'):'||name_tab(v_counter));
end loop;
end;
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 10
cursor emp_name is select ename from emp;
type name_type is table of emp.ename%type;
name_tab name_type;
v_counter integer:=0;
begin
for i in emp_name loop
v_counter:=v_counter+1;
name_tab(v_counter):=i.ename;
dbms_output.put_line('name('||v_counter||'):'||name_tab(v_counter));
end loop;
end;
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 10
2.嵌套表初始化过,但是集合为空集
declare
cursor emp_name is select ename from emp;
type name_type is table of emp.ename%type;
name_tab name_type:=name_type();
v_counter integer:=0;
begin
for i in emp_name loop
v_counter:=v_counter+1;
name_tab(v_counter):=i.ename;
dbms_output.put_line('name('||v_counter||'):'||name_tab(v_counter));
end loop;
end;
ORA-06533: Subscript. beyond count
ORA-06512: at line 10
cursor emp_name is select ename from emp;
type name_type is table of emp.ename%type;
name_tab name_type:=name_type();
v_counter integer:=0;
begin
for i in emp_name loop
v_counter:=v_counter+1;
name_tab(v_counter):=i.ename;
dbms_output.put_line('name('||v_counter||'):'||name_tab(v_counter));
end loop;
end;
ORA-06533: Subscript. beyond count
ORA-06512: at line 10
正确的使用嵌套表:
SQL> declare
2 cursor emp_name is select ename from emp;
3 type name_type is table of emp.ename%type;
4 name_tab name_type:=name_type();
5 v_counter integer:=0;
6 begin
7 for i in emp_name loop
8 v_counter:=v_counter+1;
9 name_tab.extend;
10 name_tab(v_counter):=i.ename;
11 dbms_output.put_line('name('||v_counter||'):'||name_tab(v_counter));
12 end loop;
13 end;
14 /
name(1):SMITH
name(2):ALLEN
name(3):WARD
name(4):JONES
name(5):MARTIN
name(6):BLAKE
name(7):CLARK
name(8):SCOTT
name(9):KING
name(10):TURNER
name(11):ADAMS
name(12):JAMES
name(13):FORD
name(14):MILLER
PL/SQL procedure successfully completed
2 cursor emp_name is select ename from emp;
3 type name_type is table of emp.ename%type;
4 name_tab name_type:=name_type();
5 v_counter integer:=0;
6 begin
7 for i in emp_name loop
8 v_counter:=v_counter+1;
9 name_tab.extend;
10 name_tab(v_counter):=i.ename;
11 dbms_output.put_line('name('||v_counter||'):'||name_tab(v_counter));
12 end loop;
13 end;
14 /
name(1):SMITH
name(2):ALLEN
name(3):WARD
name(4):JONES
name(5):MARTIN
name(6):BLAKE
name(7):CLARK
name(8):SCOTT
name(9):KING
name(10):TURNER
name(11):ADAMS
name(12):JAMES
name(13):FORD
name(14):MILLER
PL/SQL procedure successfully completed
3.关于集合方法
exists---某个特定元素在集合中,则返回true(用于避免subscribt_outside_limit异常)
count---返回集合中元素的总数
extend---扩展集合的大小(不适合联合数组)
delete---删除集合中的某些、某个范围内或者特定的元素,但是不释放占位符
first 和last---返回第一个和最后一个元素的下标
prior和next--返回指定集合的前序和后续下标
trim---从集合中删除最后一个元素或者指定数量的元素,并且释放占位符(不适合联合数组)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26425571/viewspace-735969/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26425571/viewspace-735969/