for select loop 시 transaction 처리 문의 드립니다. 0 2 2,803

by sun [PL/SQL] loop transaction [2019.02.22 13:22:22]


안녕하세요. 다들 고생 많으십니다.

다름 아니라. pkckage처리시 문의 좀 드리겠습니다.

procedure TEST ( )

   IS   

   EXCEPTION_ERROR EXCEPTION; 

begin 

   

         for x in (select ..고객

                     from 고객정보

                   where...)

        loop

                IF A = 1 THEN

                   proc1( );

                   if ... then 

                      RAISE EXCEPTION_ERROR ; 

                   end if ;                

               ELSEIF A = 2 THEN 

                   proc2( ) ;                   

                    if ... then 

                      RAISE EXCEPTION_ERROR ; 

                    end if ;

 

                   proc2_1111( ) ;                   

                    if ... then 

                      RAISE EXCEPTION_ERROR ; 

                    end if ;

               ELSEIF A =3 THEN    

                   proc3( );

                   if ... then 

                      RAISE EXCEPTION_ERROR ; 

                   end if ;

                  proc3_11111( );

                   if ... then 

                      RAISE EXCEPTION_ERROR ; 

                   end if ;

                  

 

                  

              END IF ; 

        end loop; 

 

       commit;

      excetion  

          when EXCEPTION_ERROR then 

                 rollback;

                update errlog

                set success_yn = 'N',

                   errormsg  = v_err_msg

                WHERE  

               ;        

                commit;

          when others then

                 rollback;

               /* 에러 표시*/

                update 고객정보

                set success_yn = 'N',

                     errormsg  = v_err_msg;   

                 WHERE  고객번호 = X.고객번호    

                commit;

 

end ;    

위와 같이 각 고객에 대해서 proc1, proc2,proc3을 실행하면서 루핑을 합니다.

제가 궁금한것은

고객이 총 10명 이라고 했을 때 , 1번고객, 2번고객,3번 고객 4번 고객은 다  proc1, proc2,proc3을 태워 처리가 되었고 

5번 고객을  proc1, proc2,proc3 태우다가  proc2 에서 에러가 났을때, 1,2,3,4번 고객에 대한 정상처리된 내역은 commit 하고 

5번 고객은 rollback; 하고 다시 6번 고객부터 계속 loop를 돌리고 싶습니다. 

5번 고객에 대해선 따로 exception 에서 에러log로 쌓을 예정이구요.. 

위의 구조라면 고객1,2,3,4고객의 정상처리된 내역까지도 rollback이 될텐데, 1,2,3,4고객은 commit하고 5번은 에러log 쌓고, 6번부터 다시 루핑을 하고 싶습니다.

이럴때 loop안에다 commit; rollback; 처리를 해야할까요? 이렇게도 해봤는데..

 

 proc2( ) ;

         if ... then 

               goto loop_continue 

           --     RAISE EXCEPTION_ERROR ; 

          end if ;

.....

...........

................

commit;

<>

   rollback;  

end loop; 

뭘 잘못했는지 총 10건이면 2건 처리되고 재실행시  또 2건 처리되고 이런식으로 반복되더군요.. 

loop안에 transaction처리를 두는게 맞다면 다시한번 확인해봐야 하겠습니다. 

총 고객이 약 2만건을 위로직으로 다 돌릴건데.. 무리인것 같기도 하구요.. 좋은 방법이나 문제점을 좀 알려주셨으면 좋겠습니다.

부탁드리겠습니다. 

 

 

by 허진영 [2019.02.22 13:59:05]

RAISE 로 Exception 처리를 하면 루프를 빠져 나가도록 되어 있어 그 이후가 실행이 되지 않는듯 합니다. 

구지 RAISE를 써야 된다면 begin proc1() exception when EXCPETION_ERROR then rollback; --log end; 이렇게 하시거나

LOOP 를 돌면서 proc3 가 끝나면 Commit을 하고 그 이전에 IF조건에서 오류가 감지되면 RAISE 하지 않고 Rollback 한다음 log를 쌓는 방법이 좋아 보입니다. 

그리고 2만건을 저렇게 루프 돌면서 프로시져를 호출 하는 것보다 각각 프로시져 안에서 2만건을 개별로 처리 하는 방법이 더 좋지 않을까 합니다.


by sun [2019.02.22 14:19:14]

답변 감사합니다.

제가 예제를 잘못 들었는데.. 다 실행하는건 아니구 조건에 따라 프로시져 실행합니다. 예제는 수정해놨구요.. 

말씀하신대로 각 프로시져별로 체크하여 EXCEPTION에서 ROLLBACK();  해보겠습니다. 

결과 다시 올릴께요.. 다른 방법 있는 분 부탁 좀 드려요.

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