错误用户输入PLS-00201:标识符' ISS'必须申报

时间:2017-03-23 14:42:11

标签: oracle plsql

为什么会出现此错误?如果变量声明的类型与列相同,则不应该这样做。 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;

1 个答案:

答案 0 :(得分:2)

如果nursing_unit_idvarchar2(10)并且您已将替换变量&v_unit定义为ISS,那么您必须将对引号中的替换变量的引用括起来,把它变成一个字符串:

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

如果您使用set verify on在SQL * Plus或SQL Developer中运行代码,您将看到该替换的前后值,这将显示它尝试执行的操作:

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;
/