如何修复标识符必须在存储过程中声明?
Posted
技术标签:
【中文标题】如何修复标识符必须在存储过程中声明?【英文标题】: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
我哪里错了?
【问题讨论】:
【参考方案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以上是关于如何修复标识符必须在存储过程中声明?的主要内容,如果未能解决你的问题,请参考以下文章