2012-12-18 58 views
1

在我的应用程序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/[email protected]$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 
+0

请发表您的PROC的一个片段,显示了异常处理。 – dogbane

+0

我已经添加了proc –

回答

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; 
+0

我已经添加了正在调用oracle过程脚本部分的unix脚本。是否有任何方法可以在不接触oracle过程部分的情况下做到这一点?最好通过unix脚本 –

+0

不,如果你的数据库过程没有引发异常,那么我不认为有任何方法可以判断它在客户端是否失败(除非你查询日志表,这不是一个好方法)。 – dogbane

0

的一种方式可能是有proc_log()也写一个日志文件,然后用unix脚本检查日志文件。

1

你大概在调用SQL * Plus,而SQL * Plus有一个应该帮助的配置项。

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

因为你很可能从一个匿名块执行过程,其误差应传播到SQL * Plus和“每当SQLERROR EXIT SQL.SQLCODE”将返回相关的错误代码的UNIX环境。

+0

的片段我已经添加了正在调用oracle过程脚本部分的unix脚本 –

+0

正如@dogbane所说的,只需在使用proc_log记录日志之后引发错误,并使用此配置的SQL * Plus来传播回到unix的错误 –