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


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

  • 相关阅读:
    Qt QString to char*
    数组和指针的异同
    QTableWidget的使用和美工总结
    static——第一次执行与它以后执行时结果不一样
    电子签名技术之疑惑
    三十六 多进程
    三十五 序列化
    vs 单元测试
    三十四 操作文件和目录
    三十三 StringIO和BytesIO
  • 原文地址:https://www.cnblogs.com/xudj/p/11534934.html
Copyright © 2020-2023  润新知