3

我有一个模式 A、包 B 和过程 C。B 在 A 模式中,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'; 显示包和包体都有效。

4

2 回答 2

3

我遇到了同样的问题并发现了问题。我将在这里写下解决此问题并帮助其他人的答案。

在我的情况下,我的用户 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 种具有相同名称的对象:用户、表、表空间和公共同义词。名为 A 的公共同义词位于名为 A 的表前面。

解决方案:因为您不确切知道谁在使用该公共同义词,所以我不得不找到另一个解决方案,而不是删除公共同义词。我为该过程创建了一个私有同义词。现在用户可以在执行代码中跳过过程的所有者而忽略公共同义词。这个问题出现在 Oracle 数据库 10.2.0.4 中。

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

结论:永远不要在模式名称中使用公共/私有同义词。

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

于 2018-02-12T10:06:55.097 回答
-1

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

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

Component 'B' must be declared.

之后授予 EXECUTE_CATALOG_ROLE 以允许用户“A”对数据字典中的包和过程执行特权。

grant EXECUTE_CATALOG_ROLE to A;
于 2012-11-10T19:33:26.050 回答