在UNIX文件中处理Oracle过程错误



目前通过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脚本检查日志文件。

最新更新