【问题标题】:Why can't execute SCHEMA_NAME.PACKAGE_NAME.PROCEDURE, Oracle为什么不能执行SCHEMA_NAME.PACKAGE_NAME.PROCEDURE,Oracle
【发布时间】:2012-08-22 01:48:23
【问题描述】:

我有一个模式 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'; 显示包和包体都有效。

【问题讨论】:

  • 这个问题的答案是:永远不要用 SCHEMA 名称命名您的同义词。在这种情况下,有一个私人同义词和一个公共同义词会导致问题。
  • 你应该把它写成答案的形式。
  • 什么是Exec?

标签: oracle plsql schema package procedure


【解决方案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 种具有相同名称的对象:用户、表、表空间和公共同义词。在名为 A 的表前面有一个名为 A 的公共同义词。

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

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

结论:切勿在架构名称中使用公共/私有同义词。

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

【讨论】:

    【解决方案2】:

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

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

    Component 'B' must be declared.
    

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

    grant EXECUTE_CATALOG_ROLE to A;
    

    【讨论】:

    • 为什么要授予 EXECUTE_CATALOG_ROLE?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多