PLSQL中的三种参数模式IN、OUT、IN OUT

送分小仙女□ 提交于 2021-02-17 04:19:49

原文链接:https://www.cnblogs.com/zbj815/p/6854108.html

 

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简单来说就是过程调用处传递的实参,在过程体内会被接收到。并且在过程体内为形参赋的值也会被传递到过程调用处。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!