目前通过unix脚本调用了我的应用程序oracle过程,当异常块中存在错误时,我们正在处理类似的事情: -
PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'Exception','Exception occured - '||SQLERRM);
proc_log除了将条目插入日志表中无能为力,但是我们现在需要在unix中捕获该错误(返回某些值0)从哪里调用,因此剩余的过程可以最好地终止,什么是最好的方法这样做?
CREATE OR REPLACE....
...
DECLARE
....
BEGIN
..
...
EXCEPTION
WHEN OTHERS THEN
PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'EXCEPTION','EXCEPTION OCCURED - '||SQLERRM);
END;
unix脚本零件来自我调用过程的位置
sqlplus <<-!
$US/$P@$I
set serveroutput on
@$SQL/execute_proc.sql $1 $2
execue_proc
包含类似的东西: -
define IN_1 = '&1';
define IN_2 = '&2';
spool $SQL/test_&&IN
declare
P_IN_TABLE_NAME varchar2(250) := '&&IN_TABLE_NAME';
P_IN_REGION varchar2(250) := '&&IN_REGION';
begin
PROC_UPDATE_CHARGE_FACT(P_IN_TABLE_NAME,P_IN_REGION);
end;
/
spool off
您需要raise
例外,例如:
EXCEPTION
WHEN OTHERS THEN
PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'EXCEPTION','EXCEPTION OCCURED - '||SQLERRM);
RAISE;
END;
或使用RAISE_APPLICATION_ERROR
:
EXCEPTION
WHEN OTHERS THEN
PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'EXCEPTION','EXCEPTION OCCURED - '||SQLERRM);
RAISE_APPLICATION_ERROR (-20002, 'An unexpected exception occurred.');
END;
您大概是在调用sql*plus,而sql*plus有一个配置项目,应该有所帮助。
http://docs.oracle.com/cd/e11882_01/server.112/e16604/ch_twelve052.htm#bachcfef
由于您可能会从匿名块执行该过程,因此错误应传播到SQL*Plus和"每当SQLERROR EXIT EXIT SQL.SQLCODE"将返回相关的错误代码。
一种方法可能是让proc_log()也写入日志文件,然后使用unix脚本检查日志文件。