2014-03-12 40 views
0

我正在使用以下過程將數據從一個表存檔到另一個表。如何處理DB倒入等異常在存儲過程中

create or replace PROCEDURE CHECK_TWO AS 
    v_insert_count number; 
    v_delete_count number; 
    v_initial_count number; 
BEGIN 

    SELECT count(*) into v_initial_count from process_state where tstamp BETWEEN  ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4); 
    dbms_output.put_line(v_initial_count); 

    insert into process_state_archive select * from process_state where tstamp BETWEEN ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4); 
    v_insert_count := sql%rowcount; 
    dbms_output.put_line(v_insert_count); 

    delete process_state where tstamp BETWEEN ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4); 
    v_delete_count := sql%rowcount; 
    dbms_output.put_line(v_delete_count); 

    if v_insert_count = v_delete_count AND v_initial_count= v_insert_count then 
    commit; 
    else 
    rollback; 
    end if; 
END CHECK_TWO; 

在這個過程中,我要處理類似服務器不可用或數據庫出故障或任何其他環境相關的問題異常。如何在我的存儲過程中處理這些場景。任何人都可以請告訴我?

回答

0

看起來像你在同一個數據庫中處理。所以,如果數據庫關閉,您的存儲過程也不會執行。但是,如果您正在處理另一個數據庫,可能有很多原因導致數據庫關閉。 PL SQL附帶有預定義的例外列表。你可以看看那個。但是,如果它不包括你的情況,你可以使用這樣的事情:

DECLARE 
    myExceptionName EXCEPTION; 
    PRAGMA EXCEPTION_INIT(myExceptionName, <exceptionNumberHere>); 
BEGIN 
    <your code here> 
EXCEPTION 
    WHEN myExceptionName THEN 
    <handle exception here> 
END; 

您可以搜索在Oracle中定義的例外號碼,並相應增加的情況下,以你的程序。 Here是Oracle 11g R2的錯誤消息和編號列表。

+0

謝謝:)另外一件事,在複製之間,如果更多的記錄添加到process_state表中,那麼這個過程會複製最近被添加的新記錄嗎? – vkreddy

+0

您的過程將存檔表中所有的內容,直到調用insert語句爲止。 – danish