Oracle Release 2 非常有力地增强了PL/SQL 集合功能,它可以对以前的发布版本进行代码维护。例如,可以在Release 2 中将PL/SQL 集合用作一个单一的参数,从而避免了使用一长串单个的字段作为参数。
另外一个优点是记录的集合现在可以是BULK COLLECTION INTO 子句的目标。而在Release 2 以前,我们必须为返回的每个列创建一个集合。例如:
Declare
type deptno_coll is table of dept.deptno%type;
type dname_coll is table of dept.dname%type;
type loc_coll is table of dept.loc%type;
deptno_list deptno_coll;
dname_list dname_coll;
loc_list loc_coll;
begin
select * bulk collect into deptno_list,dname_list,loc_list from dept;
end;
在Release 2中变成了:
Declare
type dept_coll is table of dept%rowtype;
dept_list dept_coll;
begin
select * bulk collect into dept_list from dept;
end;
注重这里不再是对字段名的引用。假如DEPT 表的字段个数或者名称被修改,也不需要对第二段示例代码进行改动。这段代码还比旧版本易于维护。然而,应用程序需要一个Release 2 数据库来编译。
现在可以使用记录以集合方式将一行数据插入到一个表中。在Release 2 之前,必须插入到表中一个PL/SQL 记录然后再单独地确定每一个字段,作法如下:
Declare
dept_row dept%rowtype;
begin
/* populate dept_row . . . */
insert into dept values (dept_row.deptno,dept_row.dname,dept_row.loc);
end;
而在Release 2中可以将插入语句简化为:
insert into dept values dept_row;
记录可以以集合方式更新一个表中的数据。像插入语句一样,以前必须单独地更新每一个字段:
update dept
set deptno = dept_row.deptno,
dname = dept_row.dname,
loc = dept_row.loc
where deptno = dept_row.deptno;
而在Release 2中,则可以根据在记录中的位置来更新整条数据:
update dept set row = dept_row where deptno = dept_row.deptno;
(注重“SET ROW”是一个新子句。)
可以使用记录从DML 语句的RETURNING 子句中检索信息。通常在更新数据时保持一个本地副本以备以后的PL/SQL 操作会比较有用。在Release 2 以前,我们可以在计算和调用完成之后使用RETURNING 子句将数据存储到某个地方。而在Release 2 中,就可以把数据存储到一条记录中。例如,下面是Release 2 之前的作法:
Declare
foorow footab%rowtype;
begin
insert into footab (foono,fooname) values (fooseq.nextval,'Foo')
returning foono,fooname into foorow.foono,foorow.fooname;
end;
而现在可以把插入语句简化为:
insert into footab (foono,fooname) values (fooseq.nextval,'Foo')
returning foono,fooname into foorow;
这些增强使得语法更加易读,并能帮助我们避免由于在返回语句中将表匹配错误所引起的程序错误。但是要记住这些增强要依靠于表和记录中第一个字段的物理位置。假如一个表的字段位置发生变化,那么字段的顺序也会变化。因此,在一个数据库表中使用ROWTYPE 匹配字段比显式地列出字段名要好。