PL/SQL复习四 复合数据类型

一、PL/SQL记录

1.简单使用:

declare

  type emp_record_type is record(

       v_empno emp.empno%type,

       v_name emp.ename%type,

       v_sal emp.sal%type  

  );

  emp_record emp_record_type;

begin

  select empno, ename, sal into emp_record from emp where empno = &no;

  --或者:select empno, ename into emp_record.v_empno, emp_record.v_name from emp where empno = &no;

    dbms_output.put_line(emp_record.v_name || emp_record.v_sal);

end;

/

2.实用rowtype定义记录类型

declare

  emp_record emp%rowtype;

begin .....

 

 

二、PL/SQL集合:(索引表(PL/SQL表)、嵌套表、变长数组(varray))

1、索引表(PL/SQL表):

   无边界(元素个数没有限制),下标可以为负值

简单使用:

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 = &no;

  dbms_output.put_line('雇员名:'|| ename_table(-1));

end;

/

(index 表示下标数据类型 可以是binary_integer、varchar2、pls_integer)

 

批量提取:

declare

  type ename_table_type is table of emp.ename%type index by binary_integer;

  ename_table ename_table_type;

begin

  select ename bulk collect into ename_table from emp;

  for i in 1..ename_table.count loop   --.count表示元素个数

    dbms_output.put_line(ename_table(i));

  end loop;

end;

/

 

使用varchar2作为下标

declare

  type ename_table_type is table of emp.ename%type index by varchar2(20);

  ename_table ename_table_type;

begin

  ename_table('北京') := 1;

  ename_table('上海') := 2;

  ename_table('广州') := 3;

  dbms_output.put_line('第一个元素: '|| ename_table('北京'));

  dbms_output.put_line('最后一个元素下标: '|| ename_table.last);

end;

/

 

2、嵌套表:

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

declare

  type ename_table_type is table of emp.ename%type;

  ename_table ename_table_type := ename_table_type('a','b');

begin

  select ename into ename_table(2) from emp where empno = &no;

  dbms_output.put_line('雇员名:'||ename_table(2));

end;

/

 

 

3、变长数组(varray):

   下标从1开始,元素的个数是有限制的

declare

  type ename_table_type is varray(20) of emp.ename%type;

  ename_table ename_table_type := ename_table_type('aa');--必须先初始化

begin

  select ename into ename_table(1) from emp where empno = &no;

  dbms_output.put_line('雇员名:'||ename_table(1));

end;

/

注意:如果初始化时没有分配足够的空间,则在接下来使用时必须先ename_table.extend;或者

ename_table.extend(x)其中x的值不能超过定义时的最大值

创建类型:create type phone_type is varray(20) of varchar2(20);

 

 

4、记录表:(即是索引表和记录的乘积)

declare

  type emp_table_type is table of emp%rowtype index by binary_integer;

  emp_table emp_table_type;

begin

  select * into emp_table(1) from emp where empno = &no;

  dbms_output.put_line('雇员姓名:' ||emp_table(1).ename);

end;

/

 

5、多级集合:

多级索引表:

declare

  --定义一维table

  type a1_table_type is table of int index by binary_integer;

  --二维table

  type a2_table_type is table of a1_table_type index by binary_integer;

  a2_table a2_table_type;

begin

  a2_table(1)(1) := 11;

  a2_table(1)(2) := 12;

  a2_table(1)(3) := 13;

  a2_table(2)(1) := 21;

  a2_table(2)(2) := 22;

  --显示:

  for i in 1..a2_table.count loop

    for j in 1..(a2_table(i).count) loop

      dbms_output.put_line(a2_table(i)(j));

    end loop;

  end loop;

end;

/

其他多级嵌套表、多级变长数组用法是一样的;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值