in 表示输入参数
out 表示输出参数
in out  表示此参数既输入又输出

解决方案 »

  1.   

    其中第二参数用到的"in"和"out"是什么意思?"in"和"out"的位置能否颠倒?
      

  2.   

    把in,out顺序倒乱,结果如下:SQL> declare
      2   v_p varchar2(100);
      3    procedure pro(v out in varchar2)
      4    as
      5    begin
      6      v:='1';
      7    end;
      8  begin
      9   pro(v_p);
     10   dbms_output.put_line(v_p);
     11  end;
     12  /declare
     v_p varchar2(100);
      procedure pro(v out in varchar2)
      as
      begin
        v:='1';
      end;
    begin
     pro(v_p);
     dbms_output.put_line(v_p);
    end;ORA-06550: 第 3 行, 第 23 列: 
    PLS-00103: 出现符号 "IN"在需要下列之一时:
     <an identifier>
       <a double-quoted delimited-identifier> LONG_ double ref
       nocopy char time timestamp interval date binary national
       character nchar
    符号 "IN" 被忽略。
      

  3.   

    以下正确例子,楼主自已多做测试才明白
    SQL> declare
      2   v_p varchar2(100);
      3    procedure pro(v in out varchar2)
      4    as
      5    begin
      6      v:='1';
      7    end;
      8  begin
      9   pro(v_p);
     10   dbms_output.put_line(v_p);
     11  end;
     12  /PL/SQL procedure successfully completed
      

  4.   

    创建过程语法:create [or replace] procedure  procedure_name
       [ (argment [ { in| in  out }]  type,
         argment  [ { in | out | in out } ] type
       { is  | as }
      <类型.变量的说明>
      ( 注:  不用 declare 语句 )
      Begin
      <执行部分>
     exception
       <可选的异常处理说明>
    end;l 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN  OUT 表示传递参数和返回参数;
    l 在存储过程内的变量类型只能指定变量类型;不能指定长度;
    l 在AS或IS 后声明要用到的变量名称和变量类型及长度;
    l 在AS或IS 后声明变量不要加declare 语句。
    例1.
    --节选自在线代码modetest.sql
    REM 作者: Scott Urman.
    REM 中文注释:赵元杰CREATE OR REPLACE PROCEDURE ModeTest (
      p_InParameter    IN NUMBER,
      p_OutParameter   OUT NUMBER,
      p_InOutParameter IN OUT NUMBER) IS  v_LocalVariable  NUMBER;BEGIN
      /* 分配 p_InParameter 给 v_LocalVariable. */
      v_LocalVariable := p_InParameter;  -- Legal
      /* 分配 7 给 p_InParameter. 这是非法的,因为声明是IN */
      p_InParameter := 7;  -- Illegal  /* 分配 7 给 p_InParameter. 这是合法的,因为声明是OUT */
      p_OutParameter := 7;  -- Legal  /* 分配 p_OutParameter 给 v_LocalVariable.这是非法的,因为声明是IN */ 
      v_LocalVariable := p_outParameter;  -- Illegal  /* 分配 p_InOutParameter 给 v_LocalVariable. 这是合法的,因为声明是IN OUT */
      v_LocalVariable := p_InOutParameter;  -- Legal  /*分配 7 给 p_InOutParameter. 这是合法的,因为声明是IN OUT */
      p_InOutParameter := 7;  -- Legal
    END ModeTest;
    /§16.2.2  使用过程
        存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、Oracle开发工具或第三方开发工具来调用运行。Oracle 使用EXECUTE 语句来实现对存储过程的调用。EXEC[UTE]  procedure_name( parameter1, parameter2…);例:
    CREATE PACKAGE emp_data AS
    TYPE EmpRecTyp IS RECORD (
    emp_id NUMBER(4),
    emp_name VARCHAR2(10),
    job_title VARCHAR2(9),
    dept_name VARCHAR2(14),
    dept_loc VARCHAR2(13));
    TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;
    PROCEDURE get_staff (
    dept_no IN NUMBER,
    emp_cv IN OUT EmpCurTyp);
    END;
    /
    CREATE PACKAGE BODY emp_data AS
    PROCEDURE get_staff (
    dept_no IN NUMBER,
    emp_cv IN OUT EmpCurTyp) IS
    BEGIN
    OPEN emp_cv FOR
    SELECT empno, ename, job, dname, loc FROM emp, dept
    WHERE emp.deptno = dept_no AND emp.deptno = dept.deptno
    ORDER BY empno;
    END;
    END;
    /
    COLUMN EMPNO HEADING Number
    COLUMN ENAME HEADING Name
    COLUMN JOB HEADING JobTitle
    COLUMN DNAME HEADING Department
    COLUMN LOC HEADING Location
    SET AUTOPRINT ON
    VARIABLE cv REFCURSOR
    EXECUTE emp_data.get_staff(20, :cv)