首页 文章

为什么无法执行SCHEMA_NAME.PACKAGE_NAME.PROCEDURE,Oracle

提问于
浏览
3

我有一个模式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

我以A登录,因此它在A的架构中 . 和SELECT * FROM user_OBJECTS WHERE OBJECT_NAME ='B';显示包和包体都有效 .

2 回答

  • -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
    

    Problem: 那是因为在数据库中创建了名为A的公共同义词 . 这是一个旧的数据库,我只是DBA,而不是开发人员,但在这种情况下,开发人员是一个没有灵感的开发人员 . 他使用了4种具有相同名称的对象:user,table,tablespace和public synonym . 名为A的表前面名为A的公共同义词 .

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

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

    Conclusion: 切勿将公共/私有同义词与模式名称一起使用 .

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

  • 1

    修复包中的 syntax error ,这是一个通用的PL / SQL编译错误消息 .

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

    Component 'B' must be declared.
    

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

    grant EXECUTE_CATALOG_ROLE to A;
    

相关问题