저의 질문은 프로시저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;
/
================================================================================