我有一个模式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';显示包和包体都有效 .
2 回答
我有同样的问题,发现了问题 . 我将在这里写下解决这个问题并帮助其他人的答案 .
在我的情况下,我的用户A对过程B具有执行权限(只是一个过程,而不是一个包,但它是相同的) . 当用户尝试运行时:
得到错误:
Problem: 那是因为在数据库中创建了名为A的公共同义词 . 这是一个旧的数据库,我只是DBA,而不是开发人员,但在这种情况下,开发人员是一个没有灵感的开发人员 . 他使用了4种具有相同名称的对象:user,table,tablespace和public synonym . 名为A的表前面名为A的公共同义词 .
Solution: 因为您不确切知道谁在使用该公共同义词,所以我必须找到另一种解决方案,而不是删除公共同义词 . 我为该程序创建了一个私有同义词 . 现在,用户可以跳过执行代码中的过程所有者,并忽略公共同义词 . 此问题出现在Oracle数据库10.2.0.4中 .
Conclusion: 切勿将公共/私有同义词与模式名称一起使用 .
希望能帮助别人 . 如果我没有说清楚,请发表评论 .
修复包中的 syntax error ,这是一个通用的PL / SQL编译错误消息 .
检查发生语法错误的PL / SQL中的错误点(
line 2, column 12
),更正它,然后尝试重新编译代码 .之后授予EXECUTE_CATALOG_ROLE以允许用户'A'执行数据字典中的包和过程的权限 .