PLSQL Language Reference-PL/SQL新功能-版本11.1 新功能

LuiseDalian發表於2014-03-06

版本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函式結果快取

函式結果快取可以節省相當的空間和時間。每次使用不同的引數呼叫結果快取函式時,這些引數和結果被儲存到緩衝區中,然後當使用相同的引數呼叫相同的函式時,會從緩衝區獲取結果,而不是重新計算。

11.1之前,如果想讓PL/SQL程式快取函式的結果,必須對快取和快取管理子程式進行設計和編碼。如果多個會話執行你的應用,每個會話必須有它自己的快取和快取管理子程式的拷貝。有時每個會話必須執行相同的代價高昂的計算。

11.1中,PL/SQL提供了函式結果快取。為了使用函式結果快取,可以在每個想快取結果的PL/SQL函式中使用result_cache子句。因為函式結果快取存在於SGA中,執行你應用的任何會話都可以訪問。

在將你的應用轉化為PL/SQL函式結果快取之後,它會使用更多的SGA,但是會使用相當少的整個系統記憶體。

複合DML觸發器

建立在表上或editioning檢視上的複合DML觸發器可以在多個時間點被觸發。每個時間點部分都有自己的執部分和可選的異常處理部分,所有的這些部分都可以訪問常規的PL/SQL state。常規state開始於觸發語句開始,消失於觸發語句結束,甚至是當觸發語句產生錯誤時。

11.1之前,開發者使用從屬包來模組化常規狀態。這種方法當觸發語句出現錯誤和語句後觸發器沒有觸發時,對應用程式是難處理的,也可能導致記憶體洩露。當你實現的行為需要在多個時間點共享資料時,複合觸發器提供了輔助的方法。

對觸發器的更多控制

create trigger語句現在支援enable, disable, follows子句,可以對觸發器有更多的控制。

disable允許建立一個disable狀態的觸發器,這樣可以在enable一個觸發器之前確保觸發器程式碼成功編譯。

enable顯示地指定的預設的觸發器狀態。

follows可以控制建立在相同表上或擁有相同時間點的觸發器的觸發順序。

自動子程式內聯

子程式內聯會將子程式呼叫替換為被呼叫的子程式的拷貝,這可以提高程式的效能。

可以使用PRAGMA INLINE指定單獨的子程式的呼叫是否內聯;也可以設定PLSQL_OPTIMIZE_LEVEL = 3,預設值為2來開啟自動內聯,讓編譯器來尋找內聯機會。

當自動內聯不會提升應用程式效能的情況下(很少),可以使用PL/SQL層次分析器來識別想關掉內聯的子程式。

PL/Scope

它是一個編譯器驅動的工具,可以用來收集和組織PL/SQL原始碼中使用者定義的識別符號的資料。因為它是一個編譯器驅動的工具,所以需要在互動式的環境(如SQL DeveloperJDeveloper)中使用它,而不是直接使用。

PL/SQL層次剖析器

它報告你的PL/SQL程式的動態執行綱要,通過子程式呼叫來組織。它分別計數SQLPL/SQL的執行次數。在動態執行綱要的每個子程式層次的概覽中包括子程式的呼叫次數、子程式自己執行的時間、子程式分支樹上花費的時間、詳細的父子關係等資訊。

可以在瀏覽器中檢視生成的HTML報告。瀏覽器的導航能力和優選出來的連結提供了有效的方法來分析大應用程式,提高應用程式的效能,降低開發成本。

PL/SQL本地編譯器直接產生原生程式碼

PL/SQL本地編譯器直接產生原生程式碼,而不是將PL/SQL程式碼轉換成C程式碼,再由C編譯器產生原生程式碼。一個個人開發者可以編譯PL/SQL單元進行本地執行,而不需要在DBA部分進行安裝。本地編譯的PL/SQL程式的執行速度提升了,有些情況下成數量級提升。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1101951/,如需轉載,請註明出處,否則將追究法律責任。

相關文章