티스토리 툴바


분류없음 | Posted by Gadenia 2011/01/04 09:18

대용량 DB 자료 삭제하기

대용량 데이터베이스에서 대량의 자료 삭제시 UNDO Table Space Full이 나거나 
Sub Procedure 돌면서 Snapshot Too Old Error가 종종 발생하는 경우
다음과 같이 해결

(PL_SQL 이용하거나 Procedure 또는 Package로 생성하여 등록하여 사용)

set time on
set timing on
set echo on
set serveroutput on

DECLARE
   CURSOR c1 IS
   SELECT ROWID FROM 디비오너.테이블명 
    WHERE 조건컬럼 -- 데이터 삭제 조건 지정
   nCNT number := 0;
   sMSG varchar2(100) := ' ';
BEGIN
      BEGIN
         FOR cur_rec IN c1 LOOP
             delete from  디비오너.테이블명 
              where rowid = cur_rec.rowid;
             nCNT := nCNT + 1;
             -- 중간 commit 수행
             if mod(nCNT, 5000) =0  then
                commit;
             end if;
         END LOOP;
         commit;
      EXCEPTION
         WHEN OTHERS THEN
            sMSG := ' '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')||to_char(nCNT,'999,999,990')||' Row Deleted';
            DBMS_OUTPUT.PUT_LINE('Delete Cnt = ' || sMSG);
        sMSG := ' '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')||'-'||SQLERRM;
            DBMS_OUTPUT.PUT_LINE('ERROR MESSAGE = ' || sMSG);
      END
   COMMIT;
   DBMS_OUTPUT.PUT_LINE('Delete Cnt = ' || nCNT);
END;

/


프로그램 호출은 Pro*C 기준으로 다음과 같이 호출

EXEC SQL EXECUTE
            DECLARE
            BEGIN
                디비오너.패키지명.바디부문(인자값);
            END;
            END-EXEC;

Creative Commons License
Creative Commons License
<PREV 1 2 3 4 5 ... 59 NEXT>