[Oracle] PL/SQL集合增強

來源:互聯網
上載者:User
[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.

責任編輯:李寧

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.