我有模式A,包B和过程C. B在模式中,C在B的包体中。
我说:
Begin
Exec B.C;
END;
但是当我说:
时,它会引发错误Begin
Exec A.B.C;
END;
Error report:
ORA-06550: line 2, column 12:
PLS-00302: component 'B' must be declared
ORA-06550: line 2, column 4:
PL/SQL: Statement ignored
我以A身份登录,因此它位于A的架构中。 和 SELECT * FROM user_OBJECTS WHERE OBJECT_NAME ='B'; 显示包和包体都有效。
答案 0 :(得分:1)
我遇到了同样的问题并发现了问题。我将在这里写下解决这个问题并帮助其他人的答案。
在我的情况下,我的用户A对过程B具有执行权限(只是一个过程,而不是一个包,但它是相同的)。当用户尝试运行时:
Begin
Exec A.B;
END;
获取错误:
ERROR at line 2:
ORA-06550: line 2, column 7:
PLS-00302: component 'B' must be declared
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
问题:这是因为在数据库中创建了名为A的公共同义词。这是一个旧的数据库,我只是DBA,而不是开发人员,但在这种情况下,开发人员是一个没有灵感的开发人员。他使用了4种具有相同名称的对象:user,table,tablespace和public synonym。名为A的表名为A的公共同义词。
解决方案:由于您不确切知道谁正在使用该公共同义词,因此我必须找到另一种解决方案,而不是删除公共同义词。我为该程序创建了一个私有同义词。现在,用户可以跳过执行代码中的过程所有者,并忽略公共同义词。此问题出现在Oracle数据库10.2.0.4中。
Begin
Exec B;
END;
PL/SQL procedure successfully completed.
结论:永远不要使用带有模式名称的公共/私有同义词。
希望能帮助别人。如果我没有说清楚,请发表评论。
答案 1 :(得分:-1)
修复程序包中的语法错误,这是一个通用的PL / SQL编译错误消息。
检查发生语法错误的PL / SQL中的错误点(line 2, column 12
),更正它,然后尝试重新编译代码。
Component 'B' must be declared.
之后授予EXECUTE_CATALOG_ROLE以允许用户'A'执行数据字典中的包和过程的权限。
grant EXECUTE_CATALOG_ROLE to A;