CREATE OR REPLACE PROCEDURE
swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
  v_temp NUMBER;
BEGIN
  v_temp := p1;
  p1 := p2;
  p2 := v_temp;
END;
/DECLARE
  num1 NUMBER := 100;
  num2 NUMBER := 200;
BEGIN
  swap(num1, num2);
  DBMS_OUTPUT.PUT_LINE('num1 = ' || num1);
  DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);
END;
/为什么不能直接execute swap(100,200)?还有in out参数有什么区别?

解决方案 »

  1.   

    in 是表示存储过程的接收参数变量,OUT是表示返回的参数变量
    可以直接执行exec swap(100,200) 或者CALL swap(100,200),都是此命令需要在SQL*PLUS里执行,或者在PL/SQL DEV的COMMAND窗口里执行
      

  2.   

    就是由于你使用了out参数
    in:传入参数
    out:传出参数 
    使用了out参数的话 就必须要对你的p2进行赋值才可以 所以就不可以直接执行execute了
    顺便说下:你的p2变量使用了in out参数 既可以是in 也可以是out 如果只是对p2输出的话 没问题
    而你对其赋值的话 p2就变成了out参数的模式 这是就不能直接execute了
      

  3.   

    CREATE OR REPLACE PROCEDURE
    swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
    BEGIN
    dbms_output.put_line(p1);
    dbms_output.put_line(p2);
    END;
    /
    如何这样写的话 直接执行execute swap(100,200)是没问题的
      

  4.   

    你这是带参存储过程,in 是输入参数,out 是输出参数,in out 是可输入输出参数
    你的p1,p2变量使用了in out参数,如果只是对p1,p2输出的话 没问题
    而你对其赋值的话p1, p2就变成了out参数的模式 这是就不能直接execute了
      

  5.   

    to Adebayor:
    为什么我这执行不了?
    CREATE OR REPLACE PROCEDURE
      2  swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
      3  BEGIN
      4  dbms_output.put_line(p1);
      5  dbms_output.put_line(p2);
      6  END;
      7  /execute swap(100,200);
    报错:
    ORA-06550: 第 2 行, 第 12 個欄位: 
    PLS-00363: 表示式 '100' 無法作為指定目標使用
    ORA-06550: 第 2 行, 第 16 個欄位: 
    PLS-00363: 表示式 '200' 無法作為指定目標使用
    ORA-06550: 第 2 行, 第 7 個欄位: 
    PL/SQL: Statement ignored
      

  6.   

    to ALL:
    如果这样写的话:
    CREATE OR REPLACE PROCEDURE
    swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
    v_temp NUMBER;
    BEGIN
    v_temp := p1;
    p1 := p2;
    p2 := v_temp;
    DBMS_OUTPUT.PUT_LINE('num1 = ' || p1);
    DBMS_OUTPUT.PUT_LINE('num2 = ' || p2);END;这样写的话在command window里是不行的,但是在sql window里却可以test,为什么会出现这样的情况?如果我在java中调用这个存储过程的话会不会出错呢?
      

  7.   

    为什么不能直接execute swap(100,200)?还有in out参数有什么区别?
    答:因为你定义的swap过程的2个参数是in out型的,如果你这样调用swap(100,200)
    的话,那么你怎么调用传出参数的值呀。
    in 代表该参数是传入参数,该参数只能够放在=号的右边。
    out代表该参数是传出参数,该参数只能够放在=号的左边。
    in out代表该参数是传入传出型的,该参数放在=号的左右都行。
      

  8.   

    to duqiangcise:
    定义为out参数的变量一定要被外界调用吗?
      

  9.   

    你可以不用调用out参数,但必须传入该参数进去。
      

  10.   

    to duqiangcise:
    哦,我好像有点理解了。。
    你是说如果存储过程中定义了out参数,那么在调用的时候一定要传入out变量 。swap()中有两个out参数,那么在调用swap()的时候一定要传入两个out变量才行,而不是直接传入两个数值。
      我理解的对吗?
      

  11.   

    可以向你说的那样理解。
    既然你已经把相应的参数定义成了in out型的了,那就证明你想通过该参数进行传入和传出值了,你要想得到该参数的传出值,那么你就必须在过程外部定义一个变量来接收该传出值。向你现在这样的方式调用该过程(execute swap(1,2);),你根本就没有在过程外部定义变量来接收该传出值。如果你在过程外部不想定义参数来接收该传出值,就说明你在过程外部是不需要获取该参数值的(那么你也就没有必须把该参数定义成in out了),所以你把该参数的类型定义为in out那么就没有必要了,还不如直接定义成in,这样能够让人很明白你该参数的使用。