[英]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.