Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不能执行SCHEMA\u NAME.PACKAGE\u NAME.PROCEDURE,Oracle_Oracle_Plsql_Schema_Package_Procedure - Fatal编程技术网

为什么不能执行SCHEMA\u NAME.PACKAGE\u NAME.PROCEDURE,Oracle

为什么不能执行SCHEMA\u NAME.PACKAGE\u NAME.PROCEDURE,Oracle,oracle,plsql,schema,package,procedure,Oracle,Plsql,Schema,Package,Procedure,我有一个模式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 但是当我说的时候,它抛出了一个错误: Begin E

我有一个模式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
但是当我说的时候,它抛出了一个错误:

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的架构中。 和 从用户对象中选择*,其中对象名称='B'; 显示包和包体都有效。

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

检查PL/SQL中发生语法错误的第2行第12列的错误点,纠正它,然后尝试重新编译代码

Component 'B' must be declared.
之后,授予EXECUTE_CATALOG_角色以允许用户“A”对数据字典中的包和过程执行权限

grant EXECUTE_CATALOG_ROLE to A;

我也有同样的问题,发现了问题所在。我会在这里写下答案来解决这个问题并帮助其他人

在我的例子中,我的用户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.
结论:永远不要将公共/私有同义词用于模式名称


希望能帮助别人。如果我没有说清楚,请留下评论。

这个问题的答案是:永远不要用SCHEMA name命名同义词。在这种情况下,有一个私有同义词和一个公共同义词导致了问题。您应该以答案的形式来回答。什么是Exec?为什么要授予EXECUTE\u CATALOG\u角色?