[Oracle] PL/SQL集合增強
Builder.com
29/12/2004
URL: http://www.zdnet.com.cn/developer/database/story/0,3800066906,39265363,00.htm
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 匹配欄位比顯式地列出欄位名要好。
本文作者:Scott Stephens已經在Oracle工作了13年有餘,他曾經在支援人員、電子商務、市場和軟體開發等部門工作。更多Scott Stephens 的 Oracle 技巧,請訪問我們的Oracle Dev Tips Library.
責任編輯:李寧