2013-02-20 64 views
10

我有以下程序所使用的一些应用程序:如何在异常处理块中重新引发pl/sql异常?

procedure p1 
is 
begin 
    bla bla bla; 
end; 

但是没有异常处理块。所以应用程序是根据此功能编写的。

现在我需要在p1中记录错误。但它不应该影响使用此过程的应用程序。

像这样:

procedure p1 
is 
begin 
    bla bla bla; 

    exception when others then 
    log_error(sqlcode, sqlerrm); 
    raise_new_exception (sqlcode, sqlerrm); 
end; 

RAISE_APPLICATION_ERROR第一参数的情况下,应在范围[-20000,-20999]。所以如果引发异常no_data_found,它不会引发这个错误。

如果是exception_init,则第二个参数不应该是可变的。它必须是数字文字。

PS:作为临时的解决方案,我用执行即时

回答

21

如果你的错误保持这种解释in the documentation相同,变化

... 
exception when others then 
    log_error(sqlcode, sqlerrm); 
    raise; 
end; 
/

+1

@AlexPoole链接已死。 – ceving 2014-10-16 14:52:28

+0

@ceving - 谢谢,我将当前的实时链接放入了答案中,而不是将来更容易更新。 – 2014-10-16 15:08:27

+1

当前[link](http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/07_errs.htm#1049) – 2015-03-13 21:41:30