프로시저에서 다른 프로시저 콜 콜 콜 시 rollback 및 error 메세지 0 3 9,499

by 옹네 [2008.12.03 17:02:21]


저의 질문은 프로시저1 에서 프로시저2 를 호출하여
각 로우별 프로시저 호출결과를 UPDATE 하는게 최종 목적입니다.

기 개발된 프로시저는 프로시저2 였고..
프로시저2는 프로시저3을 호출, 프로시저3은 프로시저4(PK번호채번용)를 호출하는 형태로 되어있습니다.
거기에 제가 프로시저2를 대량으로 일괄 돌릴일이 생겨 프로시저1을 작성하여
프로시저2를 호출하는 형태로 개발했어요.
아래 빨간색...

그런데, 프로시저2 내부에서 발생시킨 error 들.. business error들은
나의 1번 프로시저의 ,result 에 잘 들어갑니다.
그런데 프로시저3에서 무결성오류등 error를 만나서 rollback을 만나면 그냥 내 프로시저1 까지 멈춰버려요.
저는 오류가 나면 그것을 변수에 받아 무조건 result에 넣고
나머지 작업들을 진행하고 싶은데말이죠.
간단하게 프로시저를 좀 고쳤는데..실상은 데이타유무 체크하고 정확성체크하고..등등 좀 길거든요...
각종 CRUD작업들이 있고..각각 상황에 맞추어 오류가 발생하면
ROLLBACK WORK;
ret_msg := 'error msg';
RETURN;
형태로 해놨어요.
끊기지 않고...나머지 작업을 수행하려면 어떤식으로 프로시저를 고쳐야 하나요??
프로시저2, 프로시저3 등등까지 손을 봐야 하나요??
ㅠㅠ
혹 변수명이 같아서 그런가하고
프로시저1에서 ret_msg 와 ret_msg1 이라는 변수를 사용했어요.
근데 이건 아닌거같구...

빨간색에서 에라났다고 하면
프로시저1 -- 프로시저2 -- 프로시저3 : 프로시저1 update 잘됨 (아래빨간플시저빨간업뎃문)
프로시저1 -- 프로시저2 -- 프로시저3 :
--> update 안되고 프로시저1에 커서가 아직 남았는데 중도하차. 프로시저3에서 넘긴 메세지를
dbms_output.PUT_LINE 으로 프로시저2에서 찍으면 잘 나오고요
프로시저2가 프로시저1으로 안넘겨주는거 같애요.
걍 거기서 끝나는듯.

 

ㅠㅠ 구구절절 말이 너무 길지만... 무슨말인지 이해가 되시는지..ㅠㅠ

 

=================================================================================

CREATE OR REPLACE procedure ACCT.sp_aas_105save_batch_p
is
ret_msg  varchar2(100);
ret_msg1 varchar2(100);
    /* 관련 변수선언 */
    /* select curosor */
    CURSOR c_tr is
        SELECT
            ROWID,
            t.column_nm
        from AASM_ASET_BATCH t
        ;
begin
    for f_tr in c_tr loop
        IF f_tr.column_nm = '0|' THEN
          ret_msg := '수량이 0 입니다.';
        ELSE
            sp_aas_105save_p (  f_tr.column_nm   , ret_msg   );
        end if;
        IF ret_msg = 'SUCCESS' THEN
           ret_msg1 := 'sp_aas_105save_batch_p ::: SUCCESS ';
        ELSE
           ret_msg1 := 'sp_aas_105save_batch_p ::: ERROR =>'|| ret_msg;
        END IF;
        -- 처리결과 update
        update AASM_ASET_BATCH
        set    result = ret_msg1
        where  rowid = f_tr.rowid;
        commit;
    end loop;
    commit;
exception
    when others then
        rollback work;
        ret_msg := 'select error';
        return;
end sp_aas_105save_batch_p;
/

========================================================================

CREATE OR REPLACE PROCEDURE ACCT.Sp_Aas_105save_P
(   arg_mas_clss     IN    VARCHAR2, -- 분류번호(1)
    ret_msg         OUT    VARCHAR2  -- 메시지(1)
 ) IS
ret_msg1 varchar2(100);
BEGIN
        Sp_Acm_Slip_Crt_P( SUBSTR(str_move_date,1,4),    str_mas_offi_cd, str_move_date,
                           str_slip_gbn,  str_slip_dept, str_acct_dr,     str_slip_amt_dr,
                           str_slip_saup, str_acct_cr,   str_slip_amt_cr, str_slip_saup,
                           str_slip_memo, str_slip_cnst, str_slip_unit,   str_acct_gb,
                           str_slip_jghs, str_cnst_end,  str_interface,   str_slip_expn,
                           str_relt_acct, arg_emp_code,  ld_slip_no,      ret_msg1 );

       IF ret_msg1 <> 'SUCCESS' THEN
            ROLLBACK WORK;
            ret_msg := '전표생성시 오류1 (Massage : '||ret_msg1||')';

            RETURN;
        END IF;
    ret_msg := 'SUCCESS';
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK WORK;
        ret_msg := '자산이관 저장시 오류 (Massage : '||REPLACE(REPLACE(REPLACE(SQLERRM,'"',''), CHR(10),''), CHR(13),'')||')';
        RETURN;
END Sp_Aas_105save_P;
/

 

================================================================================

by 마농 [2008.12.03 17:12:55]
롤백하는 순간 지금까지 진행되 오던게 다 원상복귀됩니다.
오류 무시하고 계속 진행하시려면 롤백을 빼셔야죠.

by 옹네 [2008.12.03 17:19:30]
지금까지 작업한 cud 작업들은 rollback 하는게 맞고요,
오류가 난 원인을 최초프로시저의 result 에 넣고 싶은건데요.
그렇게 할 수 있는 방법은 없나요??
3개로우가 있을때, 그러니까 3번 호출하는건데..
2번째 데이타가 문제있으면...
1번로우성공
2번 에라
3번 성공
이런식으로 하고 싶은건데요..ㅠㅠ
이상한건...프로시저2에서 발생한 오류들은
내가 원하는 식으로 되는데..프로시저2가 프로시저3을 호출해서
프로시저3에서 오류가 나면.. 그걸 1에서 못받는거여요.
ㅠㅠ

by 마농 [2008.12.03 17:22:03]
프로시져3에서도 예외처리로 변수를 넘겨주셔야 할것 같네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입