Suppose I have schemas A
and B
.
In schema A
I would like to call package X
in schema B
. However, there exists a package B
in schema A
.
A:
package B
B:
package X
When I call from schema A:
begin b.x.foo(); end
it looks for procedure X
in package B
, i.e. A.B.X()
, and gets an error.
How can I fully qualify the call to force B
to be considered a schema name?
update:
b.x.foo
.CREATE SYNONYM B_X for B.X
works. B_X.foo()
calls the procedure in schema B.I don't think you can. From the PL/SQL User's Guide:
"The name resolution rules for PL/SQL and SQL are similar. You can avoid the few differences if you follow the capture avoidance rules. For compatibility, the SQL rules are more permissive than the PL/SQL rules. SQL rules, which are mostly context sensitive, recognize as legal more situations and DML statements than the PL/SQL rules.
The second bullet above applies. Since the object "B" exists in schema A, that's what the reference resolves to.
I agree with DCookie, this is a normal scoping problem. If you're in this situation though, one way to solve the issue would be to change the 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With