Mysql 如何修复必须在存储过程中声明的标识符?

Mysql 如何修复必须在存储过程中声明的标识符?,mysql,sql-server,oracle,stored-procedures,Mysql,Sql Server,Oracle,Stored Procedures,我正在创建一个过程,然后在SQL plus中执行它。该过程已正确创建/更新,如以下代码所示 SQL> create or replace procedure add_sal(i_empno number, addsal out number) 2 is 3 begin 4 select sal+1000 5 into addsal 6 from emp 7 where empno=i_empno; 8 end; 9 / Procedure created.

我正在创建一个过程,然后在SQL plus中执行它。该过程已正确创建/更新,如以下代码所示

SQL> create or replace procedure add_sal(i_empno number, addsal out number)
 2  is
 3  begin
 4  select sal+1000
 5  into addsal
 6  from emp
 7  where empno=i_empno;
 8  end;
 9  /

Procedure created.
当我试图执行这个过程时,我得到了一个我不理解的错误

SQL> exec add_sal(i_empno,addsal);
BEGIN add_sal(i_empno,addsal); END;
              *
ERROR at line 1:
ORA-06550: line 1, column 15:
PLS-00201: identifier 'I_EMPNO' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我哪里出错了?

要在
exec
语句中使用
I\u empno
,您必须在以下操作之前定义它:

VARIABLE i_empno NUMBER
VARIABLE addsal NUMBER
BEGIN
 :i_empno:=4;
END;
/
exec add_sal(:i_empno,:addsal);
或者您需要传递一些值:

VARIABLE addsal NUMBER
exec add_sal(1,:addsal);
SQL>exec add_sal(i_empno,addsal)

您需要传递的是值,而不是参数名本身

另外,
addsal
是一个输出参数,您需要首先声明它

SQL*Plus中

SQL> CREATE OR REPLACE PROCEDURE add_sal(
  2      i_empno NUMBER,
  3      addsal OUT NUMBER)
  4  IS
  5  BEGIN
  6    SELECT sal+1000 INTO addsal FROM emp WHERE empno=i_empno;
  7  END;
  8  /

Procedure created.

SQL>
SQL> SHO ERR
No errors.
SQL>
SQL> variable addsal NUMBER
SQL>
SQL> EXEC add_sal(7369, :addsal);

PL/SQL procedure successfully completed.

SQL>
SQL> PRINT addsal

    ADDSAL
----------
      1800

SQL>
SQL> set serveroutput on
SQL> DECLARE
  2     o_addsal NUMBER;
  3  BEGIN
  4     add_sal(7369, o_addsal);
  5     DBMS_OUTPUT.PUT_LINE('The output is : '||o_addsal);
  6  END;
  7  /
The output is : 1800

PL/SQL procedure successfully completed.

SQL>
或者,独立于SQL*Plus,您可以将其作为一个匿名块执行

SQL> CREATE OR REPLACE PROCEDURE add_sal(
  2      i_empno NUMBER,
  3      addsal OUT NUMBER)
  4  IS
  5  BEGIN
  6    SELECT sal+1000 INTO addsal FROM emp WHERE empno=i_empno;
  7  END;
  8  /

Procedure created.

SQL>
SQL> SHO ERR
No errors.
SQL>
SQL> variable addsal NUMBER
SQL>
SQL> EXEC add_sal(7369, :addsal);

PL/SQL procedure successfully completed.

SQL>
SQL> PRINT addsal

    ADDSAL
----------
      1800

SQL>
SQL> set serveroutput on
SQL> DECLARE
  2     o_addsal NUMBER;
  3  BEGIN
  4     add_sal(7369, o_addsal);
  5     DBMS_OUTPUT.PUT_LINE('The output is : '||o_addsal);
  6  END;
  7  /
The output is : 1800

PL/SQL procedure successfully completed.

SQL>

非常感谢你的回答。现在工作正常。您好,我已经在sql plus中执行了该过程,现在工作正常。但是,当我在informatica中使用相同的过程时,出现以下错误。严重性时间戳节点线程消息代码消息错误5/10/2015 12:13:20 PM node01_Unni-PC TRANSF_1_1_1_1 CMN_1022数据库驱动程序错误。。。CMN_1022[ORA-06550:第2行,第3列:PLS-00201:必须声明标识符'ADD_SAL',ORA-06550:第2行,第3列:PL/SQL:语句忽略数据库驱动程序错误…函数名称:ExecuteSP Oracle致命错误数据库驱动程序错误…函数名称:ExecuteSP Oracle致命错误]然后您需要弄清楚如何将变量从Oracle执行传递回informatica。您能解释一下如何将变量从Oracle传递回informatica吗