說明:本內容是工作用到的知識點整理,來自工作中和網絡。
代碼於Oracle9上測試。
OracleProcedure參數類型
一.實參與形參
形參:在procedure定義的時候,宣告的參數
實參:在引用procedure的時候,從外部傳入(出)的參數
形參是實參值的預留位置,實參的值是被用在procedure中的值。
在程序內,實參會借由形參來參照,當程序傳回時,形參的值會被指定給實參。
二.形參的三種模式(IN 、 OUT、 IN OUT)
IN:當程序被呼叫時,實參的值會被傳入procedure中。 在程序內部,形參就像PL/SQL常數一樣,是只讀的,不能更改。當程序結束,且控制權傳回給進行呼叫的環境時,實參值不會被改變。
OUT:當procedure被呼叫時,任何實參的值都會被忽略。在procedure內,形參就像是未被初始化的PL/SQL參數,因此具有NULL值。它可以被讀取和寫入。當procedure結束且控制權交給進行呼叫的環境時,形參內容就會被指定給實參。
IN OUT:此模式是IN和OUT的結合。當procedure被呼叫時,實參值被傳遞到procedure內。在procedure內,形參就像是已經被初始化的變量,可以被讀取和寫入。當procedure結束且控制權傳回給呼叫的環境時,形參的內容就會被指定給實參。
三.測試
測試OUT
1 Create Procedure
create or replace procedure putNum(P_Date in date, P_year out varchar2) is |
2 TestScript
declare |
3 執行結果
4 分析
使用in傳入參數,實參的值被忽略——不會使用傳入參數的值。所以輸入為空。形參的值是NULL。編譯器認為沒初始化。
測試IN OUT
1 上面的putNum(P_Date in date, P_year out varchar2) is 改為:
putNum(P_Date in date, P_year in out varchar2) is
2 輸出結果
四.總結
1 形參的三種模式:in , out, in out。默認是in。
2 一個函數需要返回一個值並且需要DML時(commit時,需使用自治事務),可以考慮OUT或IN OUT。
Oracle Procedure 參數傳遞方式
以傳址和傳值方式傳遞參數
當參數是以傳址(By Reference)方式傳遞時,指向實參的指針就會被傳遞給相對應的形參。
當參數是以傳值(By Value)方式傳遞時,它就會從實參復制到形參中。
依預設,PL/SQL會以傳址方式傳遞IN參數,以傳值方式傳遞OUT和IN OUT參數。
使用NOCOPY編譯器指示:
語法:procedure procedure_name (parameter_name [mode] NOCOPY datatype)
說明:parameter_name---->參數名稱
mode ----->參數模式(IN / OUT / IN OUT)
datatype ------>參數的數據類型
NOCOPY ------->有NOcopy出現,PL/SQL編譯器就會嘗試以傳地址方式來傳遞參數,而不是用傳值的方式。
限制:
在某些情況下,NOCOPY會被忽略,而參數還是會以傳值的方式傳遞。
在這些情況下,不會有錯誤產生。
請記住,NOCOPY是個指示,編譯器沒義務遵循它。
在以下情況會被忽略:
1.實參是組合陣列的成員。當實參為這個陣列時,此限制條件不適用
2.實參被精確度、准確度、或者NOT NULL限制條件所限制時。但是此限制對於由最大長度所限制的字元參數不適用。
3.實參和形參都是記錄,且它們是被內隱的作為循環控制的變量,或者是使用%ROWTYPE來宣告,在對應欄位上的限制不同。
4.傳遞實參需要有內隱的數據類型轉換
5.副程式牽涉到遠端程序呼叫(RPC)。由於參數必須在網絡上傳遞,所以要用傳址方式來傳遞它們是不可能的。
效能:
在所需時間上,以傳值方式傳遞IN OUT參數,會遠遠大於以傳址方式傳遞IN 和 IN OUT NOCOPY參數。