Oracle 从架构a中的存储过程调用架构B中的存储过程已停止工作
解决突然停止工作的应用程序的问题。异常抱怨存储过程不可用 我的结论是,出于某种原因,模式NGM2不再能够使用模式NGM209中的存储过程 我想出了一个简单的例子来重现和说明这个问题 在模式NGM208和NGM209中创建测试函数:Oracle 从架构a中的存储过程调用架构B中的存储过程已停止工作,oracle,stored-procedures,Oracle,Stored Procedures,解决突然停止工作的应用程序的问题。异常抱怨存储过程不可用 我的结论是,出于某种原因,模式NGM2不再能够使用模式NGM209中的存储过程 我想出了一个简单的例子来重现和说明这个问题 在模式NGM208和NGM209中创建测试函数: SQL> connect ngm208@DB SQL> create or replace function test return varchar2 as begin return 'TEST208'; end; SQL> grant execut
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
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中为这些函数创建存储过程
SQL> select ngm208.test from dual;
TEST208
SQL> select ngm209.test from dual;
TEST209
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中,它按预期工作
对此是否有合乎逻辑的解释?如果有,是什么原因?或者数据库中是否真的出了问题?对;有时候事情会突然发生。如果您试图通过创建一个同义词来愚弄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>
不能在19.5中复制。您的4位数Oracle版本是什么?是否启用了安全功能?看起来似乎在存储过程中没有启用特权,但您已经授予了直接特权(我的意思是没有角色):所以这不是解释……就是这样!。有人加了一张ngm209表。我以为我在看一个有这个问题的鬼。非常感谢。