索引表(PL/SQL表)
索引表的下标可以为负值,而且其元素个数没有限制.
Oracle9i之前,索引表的元素下标只能使用数字类型: binary_integer和PLS_integer ;
Oracle9i开始,索引表的元素下标也允许使用varchar2类型.
注:不能做为表列的数据类型使用.
Type ename_table_type is table of varchar2(100)
index by binary_integer;
ename_table ename_table_type ;
Select name into ename_table(-1) from emp where ….
declare
--数组下标索引
i binary_integer := -1 ;
--定义索引表数组类型
type ename_table_type is table of emp.ename%type index by binary_integer ;
--创建数组变量
v_ename_table ename_table_type ;
cursor v_emp_cur is select * from emp where deptno=20 ;
begin
--给数组变量赋值
for v_record in v_emp_cur loop
v_ename_table(i) := v_record.ename ;
i := i+1 ;
end loop;
--判断索引表里是否有元素
if(v_ename_table.count>0) then
--输出数组里的值
for j in v_ename_table.first..v_ename_table.last loop//从索引表的第一项,到最后一项
dbms_output.put_line(v_ename_table(j));
end loop ;
end if ;
end;
----------------------------------------------------------------------
嵌套表(Nested Table)
数组下标从1开始,长度不限.
嵌套表需要先进行初始化才能使用.
可以做为表列的数据类型使用.
Type ename_table_type is table of varchar(100);
Ename_table ename_table_type ;
--构造方法,初始情况下有两个元素.
Ename_table := ename_table_type (’A’,’A’);
--构造方法,初始情况下没有元素.
ename_table_type();
--分配一个空间
Ename_table.extend ;
Select name into ename_table(2) from emp where ….
declare
--定义嵌套表数据类型
type ename_table_type is table of emp.ename%type;
--定义嵌套表类型的变量,并调用构造方法进行初始化.
ename_table ename_table_type := ename_table_type();
cursor v_emp_cur is select ename from emp where deptno =20 ;
--定义嵌套表的开始下标
i binary_integer :=1 ;
begin
for v_record in v_emp_cur loop
--给ename_table变量分配空间
ename_table.extend;
--给ename_table变量赋值
ename_table(i) :=v_record.ename ;
i := i+1 ;
end loop ;
--输出嵌套表变量ename_table里的所有值
for j in 1..ename_table.count loop
dbms_output.put_line( ename_table(j) );
end loop ;
end;
注:在表列中使用嵌套表,需要先使用create type 命令先创建嵌套表类型.
create type phone_table_type is table of varchar2(20);
--新建
create table student
(
stuid number(5) ,
name varchar2(20),
phone phone_table_type
) nested table phone store as phone_table ;
declare
v_phone_table phone_table_type ;
begin
--在PL/SQL块中为nested table 插入数据
insert into student values(1,'lisi',phone_table_type('138111111','139111111'));
--在PL/SQL块中检索nested table 列的数据
select phone into v_phone_table from student where stuid=1 ;
for i in 1..v_phone_table.count loop
dbms_output.put_line('phone:'||v_phone_table(i) );
end loop;
v_phone_table := phone_table_type('135111111','136111111');
--在PL/SQL块中更新nested table 列的数据
update student set phone = v_phone_table where stuid=1 ;
select phone into v_phone_table from student where stuid=1 ;
for i in 1..v_phone_table.count loop
dbms_output.put_line('phone:'||v_phone_table(i) );
end loop;
commit;
end;
------------------------------------------------------------------
变长数组(Varray)
变长数组需要先进行初始化才能使用.
可以做为表列的数据类型使用.
数组下标从1开始,长度有限.
Type ename_table_type is varray(10) of varchar2(100);
Ename_table ename_table_type := ename_table_type (‘A’,null);
Select name into ename_table(2) from emp where ….
declare
--定义变长数组的类型名称,及最大长度
type ename_varray_type is varray(10) of varchar2(20);
--定义变长数组变量,并进行初始化
v_ename_varray ename_varray_type := ename_varray_type() ;
cursor v_emp_cur is select * from emp where deptno=20 ;
i binary_integer := 1 ;
begin
for v_record in v_emp_cur loop
--给变长数组分配空间
v_ename_varray.extend ;
--给变长数组赋值
v_ename_varray(i) :=v_record.ename ;
i := i + 1 ;
end loop;
--输出变长数组里的元素
for i in 1..v_ename_varray.count loop
dbms_output.put_line(v_ename_varray(i));
end loop;
end;
--在表列中使用变长数组
create type phone_arr_type is varray(5) of varchar2(20) ;
create table student
(
stuid number(4),
name varchar2(20),
phone phone_arr_type
);
//其它用法和嵌套表一样
-------------------------------------------------------------------
记录表
为了处理多行多列数据,可以使用记录表.
declare
--定义记录表类型
type emp_table_type is table of emp%rowtype index by binary_integer ;
--定义记录表变量
v_emp_table emp_table_type ;
cursor v_emp_cur is select * from emp where deptno=20 ;
--定义记录表下标索引
i binary_integer := -1 ;
begin
--给记录表变量赋值
for v_record in v_emp_cur loop
v_emp_table(i) := v_record ;
i := i + 1 ;
end loop;
--输出记录表变量的值
for j in v_emp_table.first..v_emp_table.last loop
dbms_output.put_line(v_emp_table(j).ename);
end loop;
end;