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

Mar*_*son 7 oracle plsql

假设我有模式AB.

在架构A,我想打电话给包X的模式B.但是,B架构中存在一个包A.

A:
    package B
B:
    package X
Run Code Online (Sandbox Code Playgroud)

当我从架构A调用时:

begin b.x.foo(); end
Run Code Online (Sandbox Code Playgroud)

X在包中查找过程B,即A.B.X()获得错误.

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

更新:

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

DCo*_*kie 7

我认为你不能.从PL/SQL用户指南:

"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中,因此引用所解析的内容.