从模式 A 中的存储过程调用模式 B 中的存储过程停止工作
Calling stored procedures in schema B from a stored procedure in schema A stopped working
解决突然停止工作的应用程序的问题。异常抱怨存储过程不可用。
我的结论是,出于某种原因,架构 NGM2 不再能够使用架构 NGM209 中的存储过程。
我想出了一个简单的例子来重现和说明问题。
在模式 NGM208 和 NGM209 中创建测试函数:
SQL> connect ngm208@DB
SQL> create or replace function test return varchar2 as begin return 'TEST208'; end;
SQL> grant execute on test to NGM2;
SQL> connect ngm209@DB
SQL> create or replace function test return varchar2 as begin return 'TEST209'; end;
SQL> grant execute on test to NGM2;
当连接到模式 NGM2 时,这两个函数在 SQL 中可用。
SQL> select ngm208.test from dual;
TEST208
SQL> select ngm209.test from dual;
TEST209
现在让我们在架构 NGM2 中为这些函数创建存储过程。
SQL> create or replace function test208 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM208.test into l_result from dual;
5 return l_result;
6 end;
7 /
Function created.
SQL> create or replace function test209 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM209.test into l_result from dual;
5 return l_result;
6 end;
7 /
Warning: Function created with compilation errors.
SQL> show error
Errors for FUNCTION TEST209:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/18 PLS-00302: component 'TEST' must be declared
问题来了。 NGM2 似乎无法从存储过程中找到架构 ngm209 中的存储过程。在 SQL 中,它按预期工作。
是否有对此的合乎逻辑的解释,如果有的话是什么,或者该数据库中确实出了什么问题?
对;有时事情突然开始发生。如果您尝试通过创建 synonym 并在函数中解决它来 fool Oracle 会有帮助吗?
create synonym syn_test_ngm209 for ngm209.test;
create or replace function test209 return varchar2 as
l_result varchar2(32767);
begin
l_result := syn_test_ngm209; --> no need to SELECT FROM DUAL!
return l_result;
end;
/
您可能在架构 NGM2
中有一个名为 NGM209
:
的对象
SQL> show user;
USER is "NGM2"
SQL> create sequence ngm209;
Sequence created.
SQL> @c
SQL> create or replace function test209 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM209.test into l_result from dual;
5 return l_result;
6 end;
7 /
Warning: Function created with compilation errors.
SQL> show errors
Errors for FUNCTION TEST209:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/16 PLS-00302: component 'TEST' must be declared
SQL>
SQL> drop sequence ngm209;
Sequence dropped.
SQL> @c
SQL> set echo on
SQL> create or replace function test209 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM209.test into l_result from dual;
5 return l_result;
6 end;
7 /
Function created.
SQL> show errors
No errors.
SQL>
解决突然停止工作的应用程序的问题。异常抱怨存储过程不可用。
我的结论是,出于某种原因,架构 NGM2 不再能够使用架构 NGM209 中的存储过程。
我想出了一个简单的例子来重现和说明问题。
在模式 NGM208 和 NGM209 中创建测试函数:
SQL> connect ngm208@DB
SQL> create or replace function test return varchar2 as begin return 'TEST208'; end;
SQL> grant execute on test to NGM2;
SQL> connect ngm209@DB
SQL> create or replace function test return varchar2 as begin return 'TEST209'; end;
SQL> grant execute on test to NGM2;
当连接到模式 NGM2 时,这两个函数在 SQL 中可用。
SQL> select ngm208.test from dual;
TEST208
SQL> select ngm209.test from dual;
TEST209
现在让我们在架构 NGM2 中为这些函数创建存储过程。
SQL> create or replace function test208 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM208.test into l_result from dual;
5 return l_result;
6 end;
7 /
Function created.
SQL> create or replace function test209 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM209.test into l_result from dual;
5 return l_result;
6 end;
7 /
Warning: Function created with compilation errors.
SQL> show error
Errors for FUNCTION TEST209:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/18 PLS-00302: component 'TEST' must be declared
问题来了。 NGM2 似乎无法从存储过程中找到架构 ngm209 中的存储过程。在 SQL 中,它按预期工作。
是否有对此的合乎逻辑的解释,如果有的话是什么,或者该数据库中确实出了什么问题?
对;有时事情突然开始发生。如果您尝试通过创建 synonym 并在函数中解决它来 fool Oracle 会有帮助吗?
create synonym syn_test_ngm209 for ngm209.test;
create or replace function test209 return varchar2 as
l_result varchar2(32767);
begin
l_result := syn_test_ngm209; --> no need to SELECT FROM DUAL!
return l_result;
end;
/
您可能在架构 NGM2
中有一个名为 NGM209
:
SQL> show user;
USER is "NGM2"
SQL> create sequence ngm209;
Sequence created.
SQL> @c
SQL> create or replace function test209 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM209.test into l_result from dual;
5 return l_result;
6 end;
7 /
Warning: Function created with compilation errors.
SQL> show errors
Errors for FUNCTION TEST209:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/16 PLS-00302: component 'TEST' must be declared
SQL>
SQL> drop sequence ngm209;
Sequence dropped.
SQL> @c
SQL> set echo on
SQL> create or replace function test209 return varchar2 as
2 l_result varchar2(32767);
3 begin
4 select NGM209.test into l_result from dual;
5 return l_result;
6 end;
7 /
Function created.
SQL> show errors
No errors.
SQL>