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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30097027/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 02:51:10  来源:igfitidea点击:

How to fix identifier must be declared in a stored procedure?

mysqlsql-serveroraclestored-procedures

提问by unnikrishnan

I'm creating a procedure and then execute it in SQL plus. The procedure is correctly created / updated, as you can see from the following code.

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

When I try to execute the procedure I'm getting an error that I don't understand.

当我尝试执行该过程时,我收到一个我不明白的错误。

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

Where am I going wrong?

我哪里错了?

回答by Lalit Kumar B

SQL> exec add_sal(i_empno,addsal);

SQL> exec add_sal(i_empno,addsal);

You need to pass the values, notthe parameter namesitself.

你需要传递的价值观没有参数名称本身。

Also, addsalis an OUT parameter, you need to first declareit.

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

In SQL*Plus:

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>

Alternatively, independent of SQL*Plus, you could execute it as an anonymous block:

或者,独立于 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>

回答by Janis Baiza

To use i_empnoin execstatement you must define it before:

要使用i_empnoinexec语句,您必须先定义它:

VARIABLE i_empno NUMBER
VARIABLE addsal NUMBER
BEGIN
 :i_empno:=4;
END;
/
exec add_sal(:i_empno,:addsal);

Or you need to pass some value:

或者你需要传递一些值:

VARIABLE addsal NUMBER
exec add_sal(1,:addsal);