PL/SQL集合

索引表(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;

你可能感兴趣的:(sql,J#)