简体   繁体   English

PLS-00201:必须声明标识符“ SALARY”

[英]PLS-00201: identifier 'SALARY' must be declared

This is my procedure: 这是我的程序:

create or replace procedure emp_lookup
 (empno   IN  emp55.empno%TYPE,
  salary  OUT emp55.sal%TYPE,
  empname OUT emp55.ename%TYPE)
is
begin 
  select sal , ename INTO salary, empname
  from   emp55 
  where  empno=empno;

EXCEPTION WHEN NO_DATA_FOUND THEN empname:='null';
  salary:=-1;
END;

This is the calling code: 这是调用代码:

SET SERVEROUTPUT ON

DECLARE 
  employee_name emp55.ename%TYPE;
  employee_salary emp55.sal%TYPE;
BEGIN
  emp_lookup (3244,salary,empname);
END;
/

It gives this error when executed: 执行时会出现此错误:

Error starting at line : 3 in command -
DECLARE 
  employee_name emp55.ename%TYPE;
  employee_salary emp55.sal%TYPE;
BEGIN
  emp_lookup (3244,salary,empname);

END;

Error report -
ORA-06550: line 5, column 20:
PLS-00201: identifier 'SALARY' must be declared
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored

It runs successfully but when I execute it 它成功运行,但是当我执行它时

execute emp_lookup (3346, salary, empname);

shows this error: 显示此错误:

Error starting at line : 16 in command -
BEGIN emp_lookup (3346, salary, empname); END;
Error report -
ORA-06550: line 1, column 27:
PLS-00201: identifier 'SALARY' must be declared
ORA-06550: line 1, column 54:
PL/SQL: Statement ignored

you could use bind variables to pass as OUT parameters while calling. 您可以在调用时使用绑定变量作为OUT参数传递。

VARIABLE sal NUMBER
VARIABLE name VARCHAR2(20)
execute emp_lookup (3346, :sal, :name)

If you are calling the procedure from within a PL/SQL block, you should have the OUT variables declared appropriately before calling. 如果要从PL / SQL块中调用过程,则应在调用之前适当声明OUT变量。

DECLARE
salary emp55.sal%TYPE;
empname emp55.ename%TYPE;
BEGIN
   emp_lookup (3346, salary, empname);
END;
/
var salary number
var empname varchar2(10)
create or replace procedure emp_lookup
(no IN emp55.empno%TYPE,
salary OUT emp55.sal%TYPE,
empname OUT emp55.ename%TYPE)
IS
begin
select sal , ename INTO salary, empname
from emp55
where empno=no;

EXCEPTION WHEN NO_DATA_FOUND THEN empname:='null';
salary:=-1;

execute emp_lookup (3346, :salary,:empname);
print salary

First correct your procedure code (change the name of the input variable) 首先更正您的过程代码(更改输入变量的名称)

This correction is needed because your where clause ( where empno=empno; ) is always true , so every row of the table will be returned - which is clearly not your initial intention. 由于您的where子句( where empno=empno; )始终为true ,因此需要进行此更正,因此将返回表的每一行-显然这不是您的初衷。

create or replace procedure emp_lookup
(in_empno IN emp55.empno%TYPE,
 salary OUT emp55.sal%TYPE,
 empname OUT emp55.ename%TYPE)
IS 
begin 
select sal , ename INTO salary, empname
from emp55 
where empno=in_empno;

EXCEPTION WHEN NO_DATA_FOUND THEN empname:='null';
salary:=-1;

END;

Secod run as follows: Secod运行如下:

DECLARE 
  employee_name emp55.ename%TYPE;
  employee_salary emp55.sal%TYPE;
BEGIN
  emp_lookup (3244,employee_salary ,employee_name);
  dbms_output.put_line(employee_name   || ' ' || employee_salary);
END;

You have to declare what 'salary' is: ie 您必须声明什么是“工资”:即

SET SERVEROUTPUT ON
DECLARE 
  empname emp55.ename%TYPE;
  salary emp55.sal%TYPE;
BEGIN
  emp_lookup (3244,salary,empname);
END;
/

else, 其他,

SET SERVEROUTPUT ON
DECLARE 
  employee_name emp55.ename%TYPE;
  employee_salary emp55.sal%TYPE;
BEGIN
  emp_lookup (3244,employee_salary ,employee_name );
END;
/

I reckon, any of the above solutions would resolve your issue. 我认为,以上任何一种解决方案都可以解决您的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM