gpt4 book ai didi

oracle - 为什么不能执行SCHEMA_NAME.PACKAGE_NAME.PROCEDURE,Oracle

转载 作者:行者123 更新时间:2023-12-01 15:23:08 25 4
gpt4 key购买 nike

我有架构 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';显示包和包体均有效。

最佳答案

我遇到了同样的问题并找到了问题所在。我会在这里写下解决这个问题的答案并帮助其他人。

在我的例子中,我的用户 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 的公共(public)同义词。这是一个旧数据库,我只是 DBA,不是开发人员,但在这种情况下,开发人员是一个没有灵感的开发人员。他使用了4类同名对象:user、table、tablespace和public synonym。名为 A 的表前面的名为 A 的公共(public)同义词。

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

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

结论:永远不要使用模式名称的公共(public)/私有(private)同义词。

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

关于oracle - 为什么不能执行SCHEMA_NAME.PACKAGE_NAME.PROCEDURE,Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12144254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com