集合与记录都属于PL/SQL的复合类型,集合允许将类型相同的多个变量当做一个整体进行处理,类似于Java或C语言中的数组,记录允许将多个不同类型的变量当作一个整数进行处理。通过使用记录与几集合类型,可以一次性处理多个数据,而不用一个数据一个数据地进行处理,提升了程序的性能,减轻了开发人员的工作量。
1.记录类型
记录类型的变量类似于数据库中的一条记录,一个记录类型可以包含多个简单类型的值或复杂类型的值。例如要获取员工表中员工的姓名、职位及薪资信息,如果不使用记录类型,需要定义3个变量来分别保存这些信息,如果使用了记录类型,则可以简化对多列数据的处理。如下代码演示了如何使用记录来获取 员工表 中的员工信息。
declare
-- 定义一个记录的类型
Type worker_msg_type is record(
worker_name VARCHAR2(20) ,
worker_code VARCHAR2(20) ,
worker_money VARCHAR2(20)
);
-- 声明记录类型的变量
workermsg worker_msg_type;
begin
-- 查询数据并保存到记录类型中
select worker_name,worker_code,worker_money
into workermsg
from worker_msg
where worker_code = &code ;
-- 输出数据记录并保存到记录类型中
DBMS_OUTPUT.put_line(
'员工信息:员工姓名:'
|| workermsg.worker_name
||'员工编号: '
|| workermsg.worker_code
||'员工薪资:'
|| workermsg.worker_money
);
end;
因为记录类型属于自定义复合类型,因此需要首先使用TYPE语法定义记录类型,worker_msg_type (好比JAVA先新建了一个类),然后声明了一个记录类型的变量workermsg (好比类的一个对象),代码使用SELECT-INTO 语句直接将员工姓名、职位和薪资情况写入记录类型的变量,然后使用DBMS_OUTPUT向屏幕打印输出记录类型变量的成员值。可以看到使用了记录类型后,在程序代码中对于多列数据的管理变得清爽易懂。
2.集合类型
记录类型允许同时处理单行多列的数据,PL/SQL的集合允许同时处理多行单列的数据。集合;类似于数组,PL/SQL 提供了如下3种类型。
a. 关联表:又称索引表,类似于JAVA中的数组,但是数组下标可以为负值,元素个数无限制,并且下标可以为字符类型。
b.嵌套表:嵌套表也是一种类似数组的数据类型,嵌套表下标从1开始,对元素个数没有限制。嵌套表与索引表的最大区别是嵌套表的类型可以作为表列的数据类型使用,而索引表不可以,而且嵌套表在使用前必须要使用构造函数进行初始化。
c.变长数组:与嵌套表一样,可以作为表列的数据类型使用,下标从1开始,变长数组的元素个数是有最大值的限制的,在使用前必须先使用构造方法进行初始化。
下面的示例使用索引表和游标一次性地从worker_msg 中取出所有的员工名称,然后显示到屏幕上,代码实现如下图所示。
declare
-- 定义员工名称索引表
Type worker_table is table of varchar2(20) -- 定义了一个数组
INDEX BY BINARY_INTEGER; -- 定义数组下标的数据类型
workerlist worker_table; -- 定义表类型的变量
-- 定义游标类型
cursor workercursor is
select worker_name from worker_msg;
begin
-- 如果游标没有打开,则打开游标
if not workercursor%isopen
then
open workercursor;
end if;
-- 从游标结果中提取所有的员工姓名
fetch workercursor
bulk collect into workerlist;
-- 使用for循环显示所有员工名称
for i in 1 .. workerlist.count
loop
dbms_output.put_line('员工名称:'||
workerlist(i));
end loop;
close workercursor; -- 关闭游标
end;
这段代码的执行逻辑如下图所示。
a. 与记录的定义类似,首先使用TYPE语句定义了一个索引表,将该索引表保存varchar2(20) 类型的员工姓名。
b. 在定义了表类型之后,定义了这种索引表类型的一个变量workerlist 来保存员工姓名。
c. 接下来定义了一个游标查询 worker_msg中的名称。在执行部分,使用了BLUK COLLECT INTO 一次性的将游标中所有员工的姓名列表保存在索引表中。
d. 最后通过一个for循环,在屏幕上打印出所有员工名称。
从这段代码中不难看到,使用了集合类型后,操作批量数据变得轻松,使得PL/SQL这门语言的功能变得强大了。