一、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。
二、傳值和傳引用
預設情況下,PL/SQL的in模式為傳值方式,ou、in out模式為傳引用方式。
引用傳遞的方式效率比較高,傳遞大型PL/SQL數組時表現尤為突出。
NOCOPY提示
·in模式總是以引用方式傳遞參數,所以不允許在in模式上使用NOCOPY提示;
·out、in out模式可以通過NOCOPY關鍵字來告訴PL/SQL編譯器採用引用方式來傳遞參數值;NOCOPY只是一個編譯器提示,而不是編譯指令,所以它並不是總是有效;
·以下幾種情況會忽略NOCOPY的存在,如所示: