2012-12-18 77 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的錯誤 –