2012-03-14 63 views
4

我們有一個程序處理數據庫中的大量記錄。現在有時候,如果過程耗時過長,用戶會手動取消該過程,從而拋出ORA-01013 EXCEPTION。但是,我們仍然想知道在取消過程之前處理了多少記錄。 我們嘗試生成在EXCEPTION WHEN OTHERS塊中調用的日誌,但該塊中的任何代碼似乎都不起作用。我們甚至嘗試通過PRAGMA INIT EXCEPTION爲ORA-01013提出異常,但無濟於事。該代碼似乎達到了例外,但不執行任何代碼。我猜測,由於程序被取消,EXCEPTION塊中的代碼沒有時間做任何事情,只是關閉。當用戶取消程序時出現異常ORA-01013

任何想法如何獲得在程序被取消之前處理的記錄數?我可以嘗試增加記錄每次發生commit,但想知道是否有更好的方法來實現這個

回答

4

你可以記錄進度autonomous transaction

即登錄通過AT在一個單獨的交易(有自己的提交)加工成日誌表中的行,像:

CREATE OR REPLACE 
PROCEDURE log_progress (
    p_id IN NUMBER, 
    p_data IN VARCHAR2 
) 
AS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    INSERT INTO log_table 
    (
    id, 
    logging_data 
    ) 
    VALUES 
    (
    p_id, 
    p_data 
    ); 
    -- 
    COMMIT; 
EXCEPTION 
    WHEN others 
    THEN 
     -- Log the error here 
     ... 
     -- Re-raise if needed 
     RAISE; 
END; 

如果過程被取消,那麼你可以查詢記錄的數據AT並找出有多少行已被處理,因爲日誌表中的記錄插入將不會被「主」事務回滾。

另一種方法是使用UTL_FILE包寫入日誌文件,然後在取消事務時讀取文件的內容。順便說一下,你可以把(非常多)任何你想要的代碼放到異常部分,並且如果引發異常,它將被執行。必須有另一個原因,說明爲什麼你的代碼沒有被運行,或者被引發異常的事務回滾。

http://www.exforsys.com/tutorials/oracle-11g/oracle-11g-exception-handling.html

希望它可以幫助...

+1

其實我們使用的是UTL_FILE包來準備日誌文件。由於某些原因,雖然EXCEPTION塊內的代碼沒有得到執行。我會嘗試你的另一種方法,看看是否有幫助。非常感謝 – Eosphorus 2012-03-14 17:24:02

+0

補充說明。 EXCEPTION塊內唯一的代碼是對UTL_FILE包的調用,它寫入一條日誌,說明處理了多少行 – Eosphorus 2012-03-14 17:27:57

+0

@Eosphorus,如果您發佈了您的過程代碼,我將查看並嘗試找出爲什麼EXCEPTION部分似乎沒有執行。 – Ollie 2012-03-15 08:15:35

1

我剛剛經歷過同樣的事情 - 這似乎是一個無證的錯誤:

ORA-01013是根本無法通過WHEN OTHERS逮住.. 。我不得不添加一個明確的WHEN ORA-01013塊來捕捉和處理異常...雖然文檔明確指出,當其他人將捕獲所有的運行時例外-.-

代碼來測試它:

此代碼應該始終打印'EXCEPTION OTHERS',但會在11g上打印'EXCEPTION CANCELLED' - 任何人都可以確認此行爲嗎?

DECLARE 
    e_cancelled EXCEPTION; 
    PRAGMA EXCEPTION_INIT(e_cancelled, -1013); 
BEGIN 
    BEGIN 
    RAISE e_cancelled; 
    EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('EXCEPTION OTHERS'); 
    END; 

EXCEPTION 
    WHEN e_cancelled THEN 
    DBMS_OUTPUT.PUT_LINE('EXCEPTION CANCELLED'); 
END; 
/
+0

好的...看起來這不是一個bug,而是一個未公開的特性,在大多數版本的最新補丁之一中引入(10 ..,11 ..,12 ..)看起來這是Oracle的預期行爲 - Timeout/Cancel和還有一些例外情況沒有被其他人看到 - 無證 - – Falco 2014-05-16 13:46:20

相關問題