1. 程式人生 > >PLSQL中的三種參數模式IN、OUT、IN OUT

PLSQL中的三種參數模式IN、OUT、IN OUT

代碼 問題 ima .cn lang 傳遞 repl 一個 lin

1、IN模式

IN模式是參數的默認模式,這種模式就是在程序運行的時候已經具有值,在程序體中值不會改變。

錯誤例子:

 1  create or replace procedure in_proc (
 2         p_a in number , -- 形參, 這裏的值是調用處傳遞的實參
 3         p_b in number 
 4         )as
 5 begin 
 6     p_a := 10 ;     --實參被傳遞進來以後,在這個程序體中值就不可能被改變了
 7     p_b := 20 ;
 8     DBMS_OUTPUT.PUT_LINE(p_a) ;
9 DBMS_OUTPUT.PUT_LINE(p_b) ; 10 end ;

錯誤日誌:

1 LINE/COL ERROR
2 -------- -------------------------------------------
3 6/5      PL/SQL: Statement ignored
4 6/5      PLS-00363: 表達式 P_A 不能用作賦值目標
5 7/5      PL/SQL: Statement ignored
6 7/5      PLS-00363: 表達式 P_B 不能用作賦值目標

註意:紅色區域是錯誤的代碼,值傳遞到程序體中值就不會改變了。

2、OUT模式

out模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞到存儲過程的調用處。

錯誤例子:

1 create or replace procedure out_proc (
2         p_a out number ,    --使用OUT模式 
3         p_b out number 
4         ) as 
5 begin
6         DBMS_OUTPUT.PUT_LINE(p_a :  || p_a) ; --輸出參數值
7         DBMS_OUTPUT.PUT_LINE(p_b :  || p_b) ;
8 end ;

目前out_proc過程體內並沒有對參數進行賦值,編寫一個PLSQL塊,進行驗證該過程。

1 declare
2     v_a number ;    --定義變量
3     v_b number ;
4 begin
5     v_a := 10 ; --為變量賦值
6     v_b := 20 ;
7     out_proc(v_a , v_b) ;   --調用out_proc過程
8 end ;
技術分享

可以發現此時根本沒有把參數傳遞的值打印出來,這樣就可以驗證使用OUT模式不可以傳值的問題。

程序修改:

 1 create or replace procedure out_proc (
 2         p_a out number ,    --使用OUT模式 
 3         p_b out number 
 4         ) as 
 5 begin
 6         DBMS_OUTPUT.PUT_LINE(p_a :  || p_a) ; -- OUT模式修飾的參數是不會接收從外部過程調用處傳遞進來的值
 7         DBMS_OUTPUT.PUT_LINE(p_b :  || p_b) ;
8 p_a := 100 ; -- 在過程體內為參數賦值 9 p_b := 200 ; 10 end ;

編寫PLSQL塊驗證:

 1 declare
 2 v_a number ; --定義變量
 3 v_b number ;
 4 begin
 5 v_a := 10 ;
 6 v_b := 20 ;
 7 out_proc(v_a , v_b) ; --調用out_proc過程
 8 DBMS_OUTPUT.PUT_LINE(v_a) ;
 9 DBMS_OUTPUT.PUT_LINE(v_b) ;
10 end ;

技術分享

這次值被成功輸出了。這就驗證了前面提出的問題(out模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞到存儲過程的調用處)。

簡單來說就是OUT不可以接收從該過程的調用處傳遞進來的值,只能在過程體內部對參數進行賦值,而後才能把過程體內部的值傳遞到該過程的被調用處。

3、IN OUT模式

IN OUT 通俗來說就表示既可以向過程體外傳遞參數也可以從過程體內傳出數值 。

例子:

 1 create or replace procedure inout_proc (
 2         p_a     in out      number ,    -- 定義形參
 3         p_b     in out      number 
 4         )as 
 5 begin
 6     DBMS_OUTPUT.PUT_LINE(傳遞到過程體內的 p_a :  || p_a ) ;  --打印輸出過程調用出傳遞進來的實參
 7     DBMS_OUTPUT.PUT_LINE(傳遞到過程體內的 p_b :  || p_b ) ;
 8     p_a := 100 ;    -- 在過程體內為參數賦值
 9     p_b := 200 ;
10 end ;

編寫PLSQL塊驗該過程

 1 declare
 2     v_a number ;    -- 定義變量
 3     v_b number ;
 4 begin
 5     v_a := 10 ; --為變量賦值
 6     v_b := 20 ;
 7     inout_proc(v_a , v_b) ; --調用inout_proc 傳遞實參進去
 8     DBMS_OUTPUT.PUT_LINE(傳遞到過程體內的 v_a :  || v_a ) ;   -- 輸出在過程體內被修改的值
 9     DBMS_OUTPUT.PUT_LINE(傳遞到過程體內的 v_b :  || v_b ) ;
10 end ;

執行結果:

1 傳遞到過程體內的 v_a : 10
2 傳遞到過程體內的 v_b : 20
3 傳遞到過程體內的 v_a : 100
4 傳遞到過程體內的 v_b : 200

IN OUT簡單來說就是過程調用處傳遞的實參,在過程體內會被接收到。並且在過程體內為形參賦的值也會被傳遞到過程調用處。

初學理解太淺請指出錯誤!

PLSQL中的三種參數模式IN、OUT、IN OUT