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만건을 위로직으로 다 돌릴건데.. 무리인것 같기도 하구요.. 좋은 방법이나 문제점을 좀 알려주셨으면 좋겠습니다.
부탁드리겠습니다.
RAISE 로 Exception 처리를 하면 루프를 빠져 나가도록 되어 있어 그 이후가 실행이 되지 않는듯 합니다.
구지 RAISE를 써야 된다면 begin proc1() exception when EXCPETION_ERROR then rollback; --log end; 이렇게 하시거나
LOOP 를 돌면서 proc3 가 끝나면 Commit을 하고 그 이전에 IF조건에서 오류가 감지되면 RAISE 하지 않고 Rollback 한다음 log를 쌓는 방법이 좋아 보입니다.
그리고 2만건을 저렇게 루프 돌면서 프로시져를 호출 하는 것보다 각각 프로시져 안에서 2만건을 개별로 처리 하는 방법이 더 좋지 않을까 합니다.