올바른 커서 사용예 이거 맞나요? 0 1 1,334

by 초코파일정 [PL/SQL] 커서 [2014.11.20 18:21:39]


T1테이블의 데이터를 T2테이블로 복사하는 커서이며 복사중 에러가 나도 LOOP절 안에서 COMMIT을 시켜서 실행된 행까지는 복사가 반영되게 의도된 프로시져 입니다. 그리고 LOOP절 안에서 에러가 나는 경우 커서가 안닫혔을 경우를 대비해서 예외처리절에서 커서 오픈 여부를 체크하고 닫습니다.
여기서 궁금한 점이 2가지 있습니다.

1. LOOP절안에서 COMMIT을 하면 진행된행까지 는 T2에 반영되는가?
2. LOOP절 안에서 에러가 발생하여 CLOSE CUR_TEST가 실행 안될경우를 대비한 예외처리절은 알맞은것인가?

제가 생각하는 일반적인 프로시저에서 커서 사용 구문인것 같은데
보다 더 일반적으로 더 이상적인 구문 예시는 없나요?

CREATE OR REPLACE PROCEDURE USP_TEST_CURSOR
IS 
    --T1테이블의 테이터를 커서를 통해 T2테이블로 복사한다.     
    V_T1_COLUMN1      A.COLUMN1%TYPE;    

    CURSOR CUR_TEST IS
        SELECT
          NVL(COLUMN1, '')   COLUMN1
        FROM T1
        WHERE IS_COPYED <> 'Y'
        OR IS_COPYED IS NULL;
BEGIN
    OPEN CUR_TEST;
    LOOP
        FETCH CUR_TEST
            INTO V_T1_COLUMN1;
        EXIT WHEN CUR_TEST%NOTFOUND;
       
        INSERT INTO T2(COLUMN1) VALUES (V_T1_COLUMN1);
       
        COMMIT;
    END LOOP;
    CLOSE CUR_TEST;
   
    EXCEPTION  -- exception handlers begin
       WHEN OTHERS THEN  -- handles all other errors         
          ROLLBACK;
          IF CUR_TEST%ISOPEN THEN
            CLOSE CUR_TEST;
          END IF;   
END;

by 최단경로 [2014.11.21 09:51:42]

안녕하세요.

몇자 적어 봅니다.

1. LOOP절안에서 COMMIT을 하면 진행된행까지 는 T2에 반영되는가?

-> 당연히 반영이 됩니다. 하지만 주의 하셔야 할 내용이 있습니다.

    1) Exception 이 발생하면.. 이미 적용된 내용은 Rollback 되지 않습니다.

    2) 너무 잦은 Commit은 DB에 부하를 줍니다.

    3) 생각에 따라 처리가 다릅니다.

        Procedure 호출을 어디서 하느냐에 따라서 commit 처리가 달라 집니다.

        a) program에서 호출을 한다면 transaction을 생각해서 program에서 commit을 해야 합니다.  

        b) 툴에서 그냥 해당 procedure만 호출한다면 지금 상태로도 괜찮습니다.

            다만 transaction의 처리 기준을 고민 하셔야 합니다.

            i) Loop 내에서 처리되다가 만약 exception이 발생하면 지금 상태로 빠져나와 rollback 처리를

               하고자 한다면.. loop 안에 commit을 제거고 loop 밖에서 commit을 하는 것이 맞습니다.

           ii) exception 발생시 loop를 빠져나올꺼냐.. 아니면 그냥 무시하고 loop를 끝까지 실행할꺼냐의

              처리 방식에 따라서 exception을 loop 안에서 처리 할 수도 있습니다.

              이렇게 처리하면, 성공과 실패가 나눠지고, 실패 한 것들만 다시 시도를 할 수 있겠지요..

2. LOOP절 안에서 에러가 발생하여 CLOSE CUR_TEST가 실행 안될경우를 대비한 예외처리절은 알맞은것인가?

  -> 네 맞습니다. Exception 발생을 대비하여 이미 열려진 Cursor을 닫아 주는 것이 맞습니다.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입