假设我有模式A
和B
。
在架构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中的过程。答案 0 :(得分:7)
我认为你不能。来自PL/SQL User's Guide:
“PL / SQL和SQL的名称解析规则是相似的。如果遵循捕获规避规则,可以避免一些差异。为了兼容性,SQL规则比PL / SQL规则更宽松.SQL规则,它们主要是上下文敏感的,被认为是比PL / SQL规则更合法的情况和DML语句。
上面的第二个子弹适用。由于对象“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