1

在我的应用程序中,oracle 程序当前是通过 unix 脚本调用的,当异常块中出现错误时,我们正在处理这样的事情:-

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
4

3 回答 3

1

您可能正在调用 SQL*Plus,而 SQL*Plus 有一个配置项应该会有所帮助。

http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve052.htm#BACHCFEF

由于您可能从匿名块执行该过程,因此错误应该传播到 SQL*Plus,并且“WHENEVER SQLERROR EXIT SQL.SQLCODE”会将相关的错误代码返回到 unix 环境。

于 2012-12-18T12:09:25.050 回答
1

您需要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;
于 2012-12-18T12:14:34.573 回答
0

一种方法是让 proc_log() 也写入日志文件,然后让 unix 脚本检查日志文件。

于 2012-12-18T11:37:18.613 回答