PL/SQL經典學習筆記(2-5)

LuiseDalian發表於2013-01-10

1 Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) Part Number E25519-03

1.1 PL/SQL新功能

1.1.1 版本11.2.0.2新功能

如果在整個會話生命週期宣告是不變的,則包被認為是無狀態的。

 

11.2.0.2之前,如果一個會話編譯了一個有狀態的包的包體,並且已經例項化該包的其它會話已經引用了它,則後面的會話將會產生一個嚴重的破壞性的錯誤ora-04068,因此進行hot-patching的包可能會使它的使用者陷入混亂。

 

對於在編譯時包的所有成員保持不變的包來講就屬於這種情況。因此hot-patching包就會很少可能破壞正在使用它的會話了。

1.1.2 版本11.2.0.1新功能

DBMS_PARALLEL_EXECUTE

該包允許不斷地以並行的方式更新大表中的資料,使用2個高層次的步驟:

n  將表中的行集分組到更小的chunks中。

n  並行地應用希望的update語句,每當一個chunk處理完成之後進行提交。

建議:當更新大量資料的時候採用此技術。可以提高效能、降低迴滾空間的消耗、減少持有的行鎖的數量。

 

create type語句中的force選項

11.2之前,如果一個create or replace type語句指定一個存在的型別,而這個型別具有型別依賴或表依賴,則該語句會失敗返回錯誤ora-02303。從11.2開始,如果你指定force,該語句只在指定的型別有表依賴時會失敗。

 

crossedition觸發器

該觸發器是在DML語句改變資料庫表,而與此同時一個使用該表的線上應用程式正在使用基於版本的重定義進行補丁或更新。crossedition觸發器的體被設計用來處理這些改變,這樣可以在應用程式程式碼改變結束後被正確地應用。

 

alter type語句對於特定版本ADT的限制

如果你使用基於版本的重定義來補丁或升級應用程式,則你就使用了版本物件。如果你的任何版本物件是ADT(抽象資料型別),則參考型別限制

 

alter type語句的reset選項

該選項重新設定型別的版本為1,所以它不再會被認為是演化了。

 

自動檢測結果快取函式的資料來源

11.2之前,必須指定快取結果依賴的資料來源。

11.2中資料庫可以自動檢測到結果快取函式執行時查詢的所有資料來源。

 

Oracle RAC環境中結果快取不再是私有的

對於11.1Oracle RAC環境中的每個資料庫例項都有一個私有的函式結果快取,只有在那個例項上的會話才可以訪問。如果在本地例項的私有緩衝區中沒有需要的結果,則函式體會執行以計算結果,然後結果被載入到本地緩衝區中。結果不是從其它例項的私有緩衝區獲得的。

對於11.2每個資料庫例項管理管理它們自己的本地結果緩衝區,但本地的結果緩衝區不再是私有的了,連線到遠端資料庫例項的會話可以訪問它的內容。如果在本地例項緩衝區中沒有需要的結果,則結果可能從其它例項的本地緩衝區獲得,而不是在本地計算。

1.1.3 版本11.1 新功能

正規表示式SQL函式的增強

正規表示式SQL函式regexp_instrregexp_substr功能已經增強。

還有一個新的函式regexp_count,返回模式在字串中出現的次數。

simple_integer, simple_floatsimple_double資料型別

4種資料型別分別是預定義pls_integer, binary_float, binary_double的子型別。每個型別與其對應的基型別有相同的範圍,有not null約束。

simple_integerpls_integer在溢位語義上有很在差別,但simple_floatsimple_double除了not null約束外,與基型別相同。

如果值不會為null,並且溢位檢查不是必須的,則可以使用simple_integer型別。

如果值不會為null,也可以使用simple_floatsimple_double

因為沒有通常的檢查null和溢位的開銷,這些子型別可以比它們的基型別提供顯著的更好的效能,當PLSQL_CODE_TYPE='NATIVE',因為對simple_integer的算術操作直接在硬體上完成;如果PLSQL_CODE_TYPE='INTERPRETED',則效能提升很小。

continue語句

使用該語句可以退出迴圈的當次迭代,並將控制權轉向下一次迭代。continue語句有2種形式:

n  continue(無條件的)

n  continue when (有條件的)

 

PL/SQL表示式中的序列

偽列currvalnextval使得書寫PL/SQL源文字更容易,並提高執行時的效能和可擴充套件性。

可以在使用number表示式的地方使用 序列名.curval和序列名.nextval

 

動態SQL加強

無論是本地動態SQL還是dbms_sql包都得到了增強。

本地動態SQL現在支援clob,所以支援超過32KB的動態SQL語句。

DBMS_SQL包中:

n  所有本地動態SQL支援的型別都支援。

n  dbms_sql.parse函式接受clob引數,允許動態SQL語句超過32KB

n  dbms_sql.to_refcursor函式允許將dbms_sql包轉換為本地動態SQL

n  dbms_sql.to_cursor函式允許將本地動態SQL轉換為dbms_sql

 

PL/SQL子程式呼叫中的命名和混合記法

11.1之前,一個呼叫PL/SQL子程式的SQL語句必須按位置指定實參。

11.1中基於命名的和混合的記法都是允許的。

這樣當SQL語句呼叫一個有多個預設引數的PL/SQL子程式並且只有少數實參需要提供與預設值不同的值時,可以提高可用性。

create or replace function compute_bonus(emp_id NUMBER, bonus NUMBER)

return number

is

    emp_sal number;

begin

    select salary into emp_sal

    from employees

    where employee_id = emp_id;

 

    return emp_sal + bonus;

end compute_bonus;

/

select compute_bonus(120, 50) from dual;                    -- 基於位置

select compute_bonus(bonus => 50, emp_id => 120) from dual; -- 命名

select compute_bonus(120, bonus => 50) from dual;           -- 混合

PL/SQL函式結果快取

函式結果快取可以節省相當的空間和時間。每次使用不同的引數呼叫結果快取函式時,這些引數和結果被儲存到緩衝區中,然後當使用相同的引數呼叫相同的函式時,會從緩衝區獲取結果,而 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-752444/,如需轉載,請註明出處,否則將追究法律責任。

相關文章