集合(索引表,嵌套表,变长数组)

三种集合比较
元素下标个数限制初始化表数据列
索引表(binary_integer、pls_integer、varchar2)无限制不需要不可以
嵌套表从1开始无限制需要可以
数组从1开始有最大个数需要可以

1.索引表

type type_name is table of element_type[not null] index by key_type;

type_name 自定义数据类型的名称

is table .. index 表示索引表

element_type 索引表元素的数据类型

not null 表示不请允许引用null元素

key_type(binary_integer、pls_integer、varchar2) 索引表元素下标的数据类型,注意9i前只能用binary_integer、pls_integer

元素下标可以负值,元素大小个数没有限制

set serveroutput on;
declare
  type ename_table_type is table of emp.ename%type index by binary_integer;
  ename_table ename_table_type;
begin
  select ename into ename_table(-1) from emp where empno = 7788;
  dbms_output.put_line('雇员名:' || ename_table(-1));
end;
/
雇员名:SCOTT

PL/SQL procedure successfully completed

2.嵌套表

type type_name is table of element_type;

元素下标从1开始,元素个数没有限制,数组元素值可以稀疏

使用嵌套表元素时,必须首先使用其构造方法初始化嵌套表

set serveroutput on;
declare
  type ename_table_type is table of emp.ename%type;
  ename_table ename_table_type;
begin
  ename_table:=ename_table_type('A','A');
  select ename into ename_table(2) from emp where empno = 7788;
  dbms_output.put_line('雇员名:' || ename_table(2));
end;
/
雇员名:SCOTT

PL/SQL procedure successfully completed

嵌套表还可以作为表列的数据类型使用

create type phone_type is table of varchar2(20);
/
create table employee(
id number(4),name varchar2(10),sal number(6,2) ,phone phone_type
)nested table phone store as phone_table;
/
--insert
insert into employee
values
  (1, 'scott', 800, phone_type('123456', '789012'));
commit;
--select
declare
  phone_table phone_type;
begin
  select phone into phone_table from employee where id=1;
  for i in 1..phone_table.count loop
    dbms_output.put_line('电话号码:'||phone_table(i));
  end loop;
end;
/
电话号码:123456
电话号码:789012
 
PL/SQL procedure successfully completed
--update
declare
  phone_table phone_type:=phone_type('11','22','33');
begin
  update employee set phone=phone_table where id=1;
  commit;
end;
/


3.变长数组varray

type type_name is varray(size_limit) of element_type[not null];

size_limit 指定varray元素的最大个数

元素下标从1开始,最大元素有限制,可以当作表数据列

使用前,必须要使用构造方法初始化varray元素

declare
  type ename_table_type is varray(10) of emp.ename%type;--元素最大个数定义后不可改变
  ename_table ename_table_type := ename_table_type('A','B');--初始化两个元素,可以通过ename_table.extend方法添加元素,默认为null,不能超过最大个数
begin
  select ename into ename_table(1) from emp where empno=7788; --下标从1开始,没有初始的不能直接使用,如ename_table(3)错
  dbms_output.put_line(ename_table(1));
end;
/
SCOTT
PL/SQL procedure successfully completed


在表列中使用varray

create type phone_type is varray(10) of varchar2(20);
/
create table employee(
id number(4),name varchar2(10),sal number(6,2),phone phone_type
);
/
--操作跟嵌套表列一样,元素个数有限制


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值