pl/sql开发----pl/sql表

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
 
以上例子中,以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
 
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
 
正确的使用嵌套表:
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
 
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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值