【问题标题】:How to fix identifier must be declared in a stored procedure?如何修复标识符必须在存储过程中声明?
【发布时间】:2015-07-17 18:54:06
【问题描述】:

我正在创建一个过程,然后在 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

我哪里错了?

【问题讨论】:

    标签: mysql sql-server oracle stored-procedures


    【解决方案1】:

    SQL> exec add_sal(i_empno,addsal);

    您需要传递而不是参数名称本身。

    另外,addsal 是一个OUT参数,你需要先声明它。

    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*Plus,您可以将其作为匿名块执行:

    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>
    

    【讨论】:

      【解决方案2】:

      要在exec 语句中使用i_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 plus 中执行了该过程并且它现在工作正常。但是当我在 informatica 中使用相同的过程时,它会出现以下错误。严重时间戳节点线程消息代码消息错误 5/ 10/2015 12:13:20 PM node01_Unni-PC TRANSF_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
      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2021-06-09
      • 2018-09-20
      • 2015-01-08
      • 2016-04-17
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多