Oracle過程及函數的參數模式詳解


一、In、out、in out模式

在Oracle中過程與函數都可以有參數,參數的類型可以指定為in、out、in out三種模式。

三種參數的具體說明,如下圖所示:

(1)in模式

in模式是引用傳遞。調用過程時實際參數將值以引用方式傳遞給存儲過程的形式參數,形式參數在過程中是只讀模式的,也就是說:只能通過形式參數讀取到實際參數的值。當過程執行完畢后,實際參數的值不會發生任何變化。

過程:

create or replace procedure MyProcedure(param1 in INTEGER)    --param1形式參數

AS

BEGIN

    ……..

END

調用:

num:=100;

MyProcedure(num);        --num 實際參數

分析:

實際參數num將其值100傳遞給過程的形式參數param1,param1的值變為100,過程執行完后返回到調用過程的語句,實際參數num的值不會發生任何變化。

(2)out模式

out模式是值傳遞。調用過程的時候,形式參數會忽略實際參數的值,而被初始化為null值,形式參數是可讀寫的,所以在過程中形式參數的值可以被修改,過程執行完畢后,形式參數會將其值賦值給實際參數。

過程

create or replace procedure MyProcedure(param1 out INTEGER)    --param1形式參數

AS

BEGIN

    DBMS_OUTPUT.PUT_LINE(param1);    --param1為null

    param1:=1;                --修改param1的值為1

END

調用:

num:=100;

MyProcedure(num);        --num 實際參數

分析:

實際參數並不能將其值傳給過程的形式參數,相反過程的形式參數的初始值為null,等過程執行完后param1的值變為1,過程返回時將形式參數的值賦值給實際參數,所以num的值從100變為了1;

(3)in out模式

in out模式是值傳遞的。調用過程的時候,實際參數的值會以值傳遞的方式賦值給形式參數,在過程中形式參數的值可以被修改,等過程執行完畢后,形式參數又會將其值賦值給實際參數。

過程:

create or replace procedure MyProcedure(param1 in out INTEGER)    --param1形式參數,能接受實際參數傳來的值

AS

BEGIN

    DBMS_OUTPUT.PUT_LINE(param1);    --param1為null

    param1:=1;

END

調用:

num:=100;

MyProcedure(num);        --num 實際參數

分析:

實際參數num將其值100傳遞給過程的形式參數param1,param1的值初始化為100,過程執行中param1的值變為1,等過程執行完畢返回時又將形式參數param1的值賦值給了實際參數num,所以num的值從100變為了1;

將字面值或常量當作實際參數,由於存在值的復制。所以與out或in out模式的形式參數相關聯的實際參數必須是一個變量,而不能是一個常量或表達式。必須有一個可以存儲返回值的位置。

out模式和in out模式的主要區別就是:in out模式能將實際參數的值傳遞給過程的形式參數,out模式的形式參數的初始值只能為null。

二、傳值和傳引用

默認情況下,缺省為in模式,in接收常量、變量、表達式,out/in out只能接受變量。

引用傳遞的方式效率比較高,傳遞大型PL/SQL數組時表現尤為突出。

 

IN OUT IN OUT
The default Must be specified Must be specified
Passes values to a subprogram Returns values to the caller Passes initial values to a subprogram and returns updated values to the caller
Formal parameter acts like a constant Formal parameter acts like an uninitialized variable Formal parameter acts like an initialized variable
Formal parameter cannot be assigned a value Formal parameter must be assigned a value Formal parameter should be assigned a value
Actual parameter can be a constant, initialized variable, literal, or expression Actual parameter must be a variable Actual parameter must be a variable
Actual parameter is passed by reference (a pointer to the value is passed in) Actual parameter is passed by value (a copy of the value is passed out) unless NOCOPY is specified Actual parameter is passed by value (a copy of the value is passed in and out) unless NOCOPY is specified

 

 

NOCOPY提示

·in模式總是以引用方式傳遞參數,所以不允許在in模式上使用NOCOPY提示;

·out、in out模式可以通過NOCOPY關鍵字來告訴PL/SQL編譯器采用引用方式來傳遞參數值;NOCOPY只是一個編譯器提示,而不是編譯指令,所以它並不是總是有效;

·以下幾種情況會忽略NOCOPY的存在,如下圖所示:


免責聲明!

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



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