PLSQL程序设计语言中procedure(存储过程中)的3种参数模式分析

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值