[Oracle整理]Oracle之Procedure參數類型


說明:本內容是工作用到的知識點整理,來自工作中和網絡。
代碼於Oracle9上測試。

 

OracleProcedure參數類型

一.實參與形參

形參:procedure定義的時候,宣告的參數

實參:在引用procedure的時候,從外部傳入(出)的參數

形參是實參值的預留位置,實參的值是被用在procedure中的值。

在程序內,實參會借由形參來參照,當程序傳回時,形參的值會被指定給實參。

二.形參的三種模式(IN OUTIN OUT

IN當程序被呼叫時,實參的值會被傳入procedure中。 在程序內部,形參就像PL/SQL常數一樣,是只讀的,不能更改。當程序結束,且控制權傳回給進行呼叫的環境時,實參值不會被改變。

OUTprocedure被呼叫時,任何實參的值都會被忽略。在procedure內,形參就像是未被初始化PL/SQL參數,因此具有NULL值。它可以被讀取寫入。當procedure結束且控制權交給進行呼叫的環境時,形參內容就會被指定給實參。

IN OUT此模式是INOUT的結合。當procedure被呼叫時,實參值被傳遞到procedure內。在procedure內,形參就像是已經被初始化的變量,可以被讀取寫入。當procedure結束且控制權傳回給呼叫的環境時,形參的內容就會被指定給實參。

三.測試

測試OUT

1 Create Procedure

create or replace procedure putNum(P_Date in date, P_year out varchar2) is
  v_num  number(8) := 1;
  v_days number;
  v_date date;
begin
  dbms_output.put_line('intput value:' || P_year);
  v_num  := 1;
  v_days := 1;
  v_days := to_number(to_char(P_Date, 'dd')); -- to_char(sysdate-20,'dd')
  for i in 1 .. v_days Loop
    v_date := to_date('2011/11/' || to_char(i), 'yyyy/MM/dd');
    --dbms_output.put_line(v_date);
  end loop;
  P_year := '2012';
end;

2 TestScript

declare
  v_yy varchar2(4);
begin
  v_yy := '2010';
  putnum(sysdate, v_yy);
  dbms_output.put_line('Output value:' || v_yy);
end;

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時,需使用自治事務),可以考慮OUTIN OUT

Oracle Procedure 參數傳遞方式

以傳址和傳值方式傳遞參數

當參數是以傳址(By Reference)方式傳遞時,指向實參的指針就會被傳遞給相對應的形參。

當參數是以傳值(By Value)方式傳遞時,它就會從實參復制到形參中。

預設PL/SQL會以傳址方式傳遞IN參數,以傳值方式傳遞OUTIN 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參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM