当前位置: 代码迷 >> SQL >> PL/SQL温习四 复合数据类型
  详细解决方案

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

热度:18   发布时间:2016-05-05 13:58:14.0
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;

/

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

?

?

  相关解决方案