我有一个来自其他模式的Oracle PL/SQL函数的源代码,我无法更改它。如果它抛出错误,我该如何处理?
如果你只使用该函数,并依赖于它返回的结果+担心它是否会失败(好吧,谁说会失败?也许它是防故障的(,那么对你来说是个好消息:由于该函数在空间中并不孤单,你可以在自己的模式中创建一个包装器函数。您的函数将调用"原始"并处理可能的异常。
这里有一个简单的例子,只是为了说明我的意思。
作为mike
连接,我将创建返回错误的函数(并将其授予scott
(:
SQL> connect mike/lion
Connected.
SQL> create or replace function f_fail return number as
2 begin
3 return 1/0;
4 end;
5 /
Function created.
SQL> select f_fail from dual;
select f_fail from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "MIKE.F_FAIL", line 3
SQL> grant execute on f_fail to scott;
Grant succeeded.
连接为scott
并调用该函数;当然,它会失败:
SQL> connect scott/tiger
Connected.
SQL> select mike.f_fail from dual;
select mike.f_fail from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "MIKE.F_FAIL", line 3
好吧,让我们创建包装器函数,看看它的行为(我将使用when others
,它可能是最糟糕的异常处理程序;我建议您采取更明智的方法,在异常发生时处理异常(。
SQL> create or replace function f_wrapper return number as
2 begin
3 return mike.f_fail;
4 exception
5 when others then
6 return 0;
7 end;
8 /
Function created.
SQL> select f_wrapper from dual;
F_WRAPPER
----------
0
SQL>
啊哈!不再出现除以零错误!
看看是否有帮助。