Oracle:消除表和模式名称之间的歧义

时间:2009-09-21 21:51:29

标签: oracle plsql

假设我有模式AB

在架构A中,我想在架构X中调用包B。但是,架构B中存在一个包A

A:
    package B
B:
    package X

当我从架构A调用时:

begin b.x.foo(); end

它在X包中查找过程B,即A.B.X(),并收到错误。

如何完全限定强制B的调用被视为模式名称?

更新

  • 似乎没有办法将引用范围扩大到引用b.x.foo
  • CREATE SYNONYM B_X for B.X有效。 B_X.foo()调用架构B中的过程。

2 个答案:

答案 0 :(得分:7)

我认为你不能。来自PL/SQL User's Guide:

“PL / SQL和SQL的名称解析规则是相似的。如果遵循捕获规避规则,可以避免一些差异。为了兼容性,SQL规则比PL / SQL规则更宽松.SQL规则,它们主要是上下文敏感的,被认为是比PL / SQL规则更合法的情况和DML语句。

  • 当PL / SQL编译器处理SQL语句(例如DML语句)时,PL / SQL使用与SQL相同的名称解析规则。例如,对于诸如HR.JOBS之类的名称,SQL首先匹配HR模式中的对象,然后匹配当前模式中的包,类型,表和视图。
  • PL / SQL使用不同的顺序来解析PL / SQL语句中的名称,例如赋值和过程调用。对于名称为HR.JOBS的情况,PL / SQL首先搜索当前模式中名为HR的包,类型,表和视图,然后搜索HR模式中的对象。“

上面的第二个子弹适用。由于对象“B”存在于模式A中,这就是引用所解析的内容。

答案 1 :(得分:3)

我同意DCookie,这是一个正常的范围问题。如果您处于这种情况,解决问题的一种方法是更改​​CURRENT_SCHEMA

SQL> exec b.x.foo;

begin b.x.foo; end;

ORA-06550: line 2, column 9:
PLS-00302: component 'X' must be declared
ORA-06550: line 2, column 7:
PL/SQL: Statement ignored

SQL> alter session set current_schema=b;

Session altered

SQL> exec b.x.foo;

PL/SQL procedure successfully completed