【问题标题】:Error user input PLS-00201: identifier 'ISS' must be declared [duplicate]错误用户输入 PLS-00201:必须声明标识符“ISS”
【发布时间】:2017-08-16 04:49:30
【问题描述】:

为什么会出现此错误?如果变量声明与列的类型相同,则不应该这样做。 Nursing_unit_id 是一个 varchar2(10)。当 ID 是 NUMBER 时,它对我来说就像这样;

我得到的错误: 错误报告 - ORA-06550:第 13 行,第 13 列: PLS-00201:必须声明标识符“ISS”

SET SERVEROUTPUT ON;
DECLARE
v_unit ADMISSIONS.NURSING_UNIT_ID%TYPE := &v_unit;
v_admissions ADMISSIONS%ROWTYPE;

CURSOR c_admissions IS
  SELECT *
  INTO v_admissions
  FROM ADMISSIONS
  WHERE NURSING_UNIT_ID = v_unit;

BEGIN
  FOR r_admissions IN c_admissions
  LOOP  
    DBMS_OUTPUT.PUT_LINE(r_admissions );
  END LOOP;
END;

【问题讨论】:

  • ISS 是我为护理单元 ID 输入的用户输入
  • 这不是正确的 CURSOR 语法。您声明游标,然后在 BEGIN 之后您 OPEN、FETCH 和 CLOSE 游标。此外,为您的绑定变量 (&v_unit) 赋予与您的 valriable 不同的名称。另外,我认为您不能将 ROWTYPE 变量传递给 DBMS_OUTPUT.put_line() - 它需要一个文本参数

标签: oracle plsql


【解决方案1】:

如果 nursing_unit_idvarchar2(10) 并且您已将替换变量 &v_unit 定义为 ISS,那么您必须将替换变量的引用括在引号中,以使其成为字符串:

v_unit ADMISSIONS.NURSING_UNIT_ID%TYPE := '&v_unit';

如果您在 SQL*Plus 或 SQL Developer 中使用set verify on 运行代码,您将看到该替换的前后值,这表明它正在尝试这样做:

v_unit ADMISSIONS.NURSING_UNIT_ID%TYPE := ISS;

而不是你得到的引用:

v_unit ADMISSIONS.NURSING_UNIT_ID%TYPE := 'ISS';

您仍然会遇到其他错误;下一个是:

PLS-00306:调用“PUT_LINE”时参数的数量或类型错误

您已将v_admissions 定义为行类型,​​这意味着它是一条记录。你不能用dbms_output一次性写出整条记录,你必须分别引用每个字段,例如(使用您修改后的代码,其中 `r_admissions 也隐式属于同一行类型):

    DBMS_OUTPUT.PUT_LINE(r_admissions.nursing_unit_id);

在游标定义中有into 子句没有用;它实际上并未填充,因此您可以删除该子句和 v_admissions 变量声明。您也不需要v_unit 局部变量,您可以直接使用替换变量;并且您可以使用多种游标形式,例如:

SET SERVEROUTPUT ON;
BEGIN 
  FOR r_admissions IN (
    SELECT *
    FROM ADMISSIONS
    WHERE NURSING_UNIT_ID = '&v_unit'
  )
  LOOP  
    DBMS_OUTPUT.PUT_LINE(r_admissions.nursing_unit_id);
    -- and anything else you want to do with that row's data
  END LOOP;
END;
/

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多