【问题标题】:PLS-00201: identifier 'SALARY' must be declaredPLS-00201:必须声明标识符“SALARY”
【发布时间】:2018-08-02 00:56:52
【问题描述】:

这是我的程序:

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;

这是调用代码:

SET SERVEROUTPUT ON

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

执行时出现此错误:

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

它运行成功,但是当我执行它时

execute emp_lookup (3346, salary, empname);

显示此错误:

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

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您可以在调用时使用绑定变量作为OUT 参数传递。

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

    如果您从 PL/SQL 块中调用该过程,您应该在调用之前正确声明 OUT 变量。

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

    【讨论】:

    • 我确实做了一个声明 SET SERVEROUTPUT ON DECLARE employee_name emp55.ename%TYPE; employee_salary emp55.sal%TYPE; BEGIN emp_lookup (3244,salary,empname);结束;
    • @R.Al :编辑问题,添加完整的过程调用代码。
    • 它没有工作它从第 3 行开始显示此错误命令 - DECLARE employee_name emp55.ename%TYPE; employee_salary emp55.sal%TYPE; BEGIN emp_lookup (3244,salary,empname);结尾;错误报告 - ORA-06550:第 5 行,第 20 列:PLS-00201:必须声明标识符 'SALARY' ORA-06550:第 5 行,第 1 列:PL/SQL:语句被忽略 06550。00000 -“行 %s,列%s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动:
    • 从第 20 行开始的错误命令 - BEGIN emp_lookup (3346, :sal, :name);结尾;错误报告 - ORA-01422:精确提取返回超过请求的行数 ORA-06512:在“SYS.EMP_LOOKUP”,第 7 行 ORA-06512:在第 1 行 01422。00000 -“精确提取返回超过请求的行数" *原因:exact fetch 中指定的数字小于返回的行数。 *操作:重写查询或更改请求的行数
    • @R.Al ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at "SYS.EMP_LOOKUP 此错误与您遇到的问题无关。 Kaushik 提供的答案将解决您遇到的问题。
    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      第一 更正您的程序代码(更改输入变量的名称)

      需要进行此更正,因为您的 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;
      

      运行如下:

      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;
      

      【讨论】:

        【解决方案4】:

        你必须声明什么是“薪水”:即

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

        否则,

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

        我认为,上述任何解决方案都可以解决您的问题。

        【讨论】:

          猜你喜欢
          • 2014-06-24
          • 1970-01-01
          • 1970-01-01
          • 2019-12-17
          • 2021-12-22
          • 2016-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多