如何纠正“PLS-00302:必须声明组件”错误

Posted

技术标签:

【中文标题】如何纠正“PLS-00302:必须声明组件”错误【英文标题】:How to rectify "PLS-00302: component must be declared" error 【发布时间】:2019-06-18 15:43:05 【问题描述】:

我正在尝试编译以下代码,但出现以下错误:

“PLS-00302:必须声明组件‘DEPT_ID’”。

DECLARE
DEPT_ID DEPARTMENTS.DID%TYPE;
DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
D_MID DEPARTMENTS.MANAGER_ID%TYPE;
D_LID DEPARTMENTS.LOCATION_ID%TYPE;
CURSOR C2 IS SELECT * FROM DEPARTMENTS WHERE DID=1;
D_ROW C2%ROWTYPE;
BEGIN
OPEN C2;
LOOP
FETCH C2 INTO D_ROW;
EXIT WHEN C2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(D_ROW.DEPT_ID||' | '||D_ROW.DEPT_NAME||' | '||D_ROW.D_MID||' | '||D_ROW.D_LID);
END LOOP;
CLOSE C2;
END;

【问题讨论】:

您的表真的有DIDDEPT_ID 列吗?该错误表明后者实际上并不存在......以及局部变量的用途是什么;暂时不用? 感谢@AlexPoole 的评论。 Departments 表包含 DID 列,DEPT_ID 是我定义的变量。 【参考方案1】:

看来你需要转换成:

DECLARE
-- DEPT_ID DEPARTMENTS.DID%TYPE;
-- DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
-- D_MID DEPARTMENTS.MANAGER_ID%TYPE;
-- D_LID DEPARTMENTS.LOCATION_ID%TYPE;
   CURSOR C2 IS SELECT * FROM DEPARTMENTS WHERE DID=1;
   D_ROW C2%ROWTYPE;
BEGIN
   OPEN C2;
 LOOP
   FETCH C2 INTO D_ROW;
  EXIT WHEN C2%NOTFOUND;
  DBMS_OUTPUT.PUT_LINE(D_ROW.DID||' | '||D_ROW.DEPARTMENT_NAME||' | '||
                       D_ROW.MANAGER_ID||' | '||D_ROW.LOCATION_ID);
 END LOOP;
 CLOSE C2;
END;
/

那些局部变量不需要,因为它们相关列的引用已经存在于C2%rowtype 中,并且应该由D_ROW 使用列名调用。由于使用局部变量而不是 D_ROW. 前缀之后的那些列,会引发错误。例如

DBMS_OUTPUT.PUT_LINE(D_ROW.DEPT_ID||' | '||D_ROW.DEPT_NAME||' | '|| 
                     D_ROW.D_MID||' | '||D_ROW.D_LID);

转换为

  DBMS_OUTPUT.PUT_LINE(D_ROW.DID||' | '||D_ROW.DEPARTMENT_NAME||' | '||
                       D_ROW.MANAGER_ID||' | '||D_ROW.LOCATION_ID);

Demo

【讨论】:

谢谢@AlexPoole,你明白我的意思:) 好的,谢谢。 感谢@BarbarosOzhan 的评论。对我这样的初学者很有帮助。我的问题现在解决了。感谢您澄清我的疑问。【参考方案2】:

开始于:

select owner, object_type, object_name
from all_objects
where object_name = 'DEPT_ID';

可能,之前已经声明过具有这样名称的对象

[dba-oracle][1]http://dba-oracle.com/t_pls_00302.htm

【讨论】:

感谢@Ravshan 的评论。没有创建这样的对象。

以上是关于如何纠正“PLS-00302:必须声明组件”错误的主要内容,如果未能解决你的问题,请参考以下文章

必须声明组件错误 (ORA-06550)

当导入到 oracle 10g 得到错误 6550

我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入

如何纠正错误的ESXi共享存储配置

如何纠正/改进我的 CNN 模型?如何处理验证准确性冻结问题?

如何纠正预期类型错误? [复制]