Oracle PL/SQL集合增強
2024-08-29 13:49:42
供稿:網友
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 匹配字段比顯式地列出字段名要好。