一、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的存在,如下圖所示: