为什么会出现此错误?如果变量声明的类型与列相同,则不应该这样做。 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;
答案 0 :(得分:2)
如果nursing_unit_id
为varchar2(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;
/