元素下标 | 个数限制 | 初始化 | 表数据列 | |
索引表 | (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 ); / --操作跟嵌套表列一样,元素个数有限制