2012-08-27 103 views
3

我有一个模式A,包B和过程C. B在A模式中,C在B的包体中。为什么不能执行SCHEMA_NAME.PACKAGE_NAME.PROCEDURE,Oracle

,当我说这工作得很好:

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的模式。 和 SELECT * FROM user_OBJECTS WHERE OBJECT_NAME ='B'; 显示包和包体都有效。

+1

那么这个问题的答案是: 永远不要用SCHEMA名字命名您的同义词。 在这种情况下,有一个私人同义词和一个导致问题的公共同义词。 – user1617237

+1

你应该把它放在答案的形式。 – DCookie

+0

什么是Exec? –

回答

-2

修复了语法错误在包中,这是一个普通的PL/SQL编译错误消息。

检查PL/SQL中发生语法错误的错误点(line 2, column 12),更正它,然后尝试重新编译代码。

Component 'B' must be declared. 

之后,授予EXECUTE_CATALOG_ROLE允许用户'A'执行数据字典中的包和过程的权限。

grant EXECUTE_CATALOG_ROLE to A; 
+1

为什么要授予EXECUTE_CATALOG_ROLE? –

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 

问题:那是因为有名称的公共同义词是在数据库中创建。这是一个旧数据库,我只是DBA,而不是开发人员,但在这种情况下,开发人员是一个没有灵感的开发人员。他使用了4种具有相同名称的对象:用户,表,表空间和公共同义词。因为你不知道到底是谁在使用公共同义词我必须找到另一种解决方案,而不是删除公共同义词:在一个表名为A.

解决方案的前命名为A公共同义词。我为该过程创建了一个私有同义词。现在用户可以跳过执行代码中的程序所有者,并忽略公共同义词。此问题出现在Oracle数据库10.2.0.4中。

Begin 
Exec B; 
END; 
PL/SQL procedure successfully completed. 

结论:不要使用公共/私有同义词与架构的名称。

希望能帮到别人。如果我没有说清楚,请发表评论。