2014-03-12 2 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; 

: 귀하의 경우는 거기에 포함되어 있지 않은 경우에는, 다음과 같이 사용할 수 있습니다. Here은 Oracle 11g R2의 오류 메시지 및 번호 목록입니다.

+0

고마워요. :) 한 가지 더요, 복사 사이에, 더 적은 레코드가 process_state 테이블에 추가 된 경우이 절차는 최근에 추가되는 새 레코드를 복사합니까? – vkreddy

+0

프로 시저는 insert 문이 호출 될 때까지 테이블에 있던 모든 것을 아카이브합니다. – danish