一、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;
/
其他多级嵌套表、多级变长数组用法是一样的;