안녕하세요.
암호한 필드를 디코드할때 오류를 발생한 필드를 다시 암호화 하여 UPDATE 할려고 합니다.
그런데... 오류를 발생하면 바로 종료되는데... 종료가 아니라 전체 테이블 조회 및 업데이트를 하고 싶습니다.
참고로 오류는 [ORA-29532 : 자바 호출이 잡혀지지 않은 자바예외 인해 종료되었습니다.~~]
입니다.
어떻게 프로시져를 수정하면 테이블 전체를 체크해서 update 할 수 있을까요???
---------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE PRO_CHK_NM IS v_check_cnt number(20) := 1; v_rows_cnt number(20) := 0; v_mem_id varchar(255) :=''; v_check_name varchar(255) :=''; v_check_idcno varchar(255) :=''; v_check1_info varchar(255) :=''; v_check2_info varchar(255) :=''; v_check3_info varchar(255) :=''; BEGIN WHILE v_check_cnt < 1200000 loop Select RCNT, MEM_ID, MEM_NAME, MEM_IDCNO INTO v_rows_cnt, v_mem_id, v_check_name, v_check_idcno From ( Select ROWNUM AS RCNT, MEM_ID, MEM_NAME, MEM_IDCNO From TBUSERINFO where 1=1 AND SUBSTR(MEM_ID, 0, 1) IN ('AZ','AB') ) where 1=1 AND RCNT = v_check_cnt; Select '보정'||TO_CHAR(SYSDATE,'YYYYMMDDHH24MMSS') INTO v_check1_info From DUAL; Select FC_DC_NAME(MEM_NAME), FC_DC_SNO(MEM_IDCNO) INTO v_check2_info, v_check3_info From TBUSERINFO where MEM_ID = v_mem_id; v_check_cnt := v_check_cnt+1; END LOOP; EXCEPTION WHEN OTHERS THEN UPDATE TBUSERINFO SET MEM_NAME = FC_IC_NAME(v_check1_info) where MEM_ID = v_mem_id; END PRO_CHK_NM;
-----------------------------------------------------------------------------------------------------
일단은 프로시저 구조 자체가 아주 비효율 적이네요.
120만번 loop를 돌면서 매번 TBUSERINFO 테이블을 읽고 rownum을 지정한 다음
해당 순번의 자료를 가지고 오는데..
이러면 엄청 성능이 안 좋을 것이고요.
TBUSERINFO 테이블 자료가 120만개가 되지 않으면
나머지 loop는 전혀 필요 없게 되네요.
TBUSERINFO테이블을 cursor로 처리하시는 게 나아보입니다.
그리고 자바 오류는 왜 나는 것인지 확실하지는 않지만
exception 구문의 update 문에서 뭔가 오류가 난 것이 아닌가 하는데
혹시 mem_name 필드가 not null 필드인데 null로 update하는 경우가 생기지 않는지 검토해보세요.
DECLARE v_mem_name VARCHAR2(255); v_check1_info VARCHAR2(255); CURSOR c0 IS SELECT mem_id, mem_name, mem_idcno FROM tbuserinfo WHERE SUBSTR(mem_id, 1, 2) IN ('AZ', 'AB') ORDER BY mem_id ; DeCrypt_Error EXCEPTION; PRAGMA EXCEPTION_INIT(DeCrypt_Error, -29532); BEGIN FOR c1 IN c0 LOOP BEGIN v_mem_name := fc_dc_name(c1.mem_name); EXCEPTION WHEN DeCrypt_Error THEN v_check1_info := '보정'||TO_CHAR(sysdate, 'yyyymmddhh24miss'); UPDATE tbuserinfo SET mem_name := fc_ic_name(v_check1_info); WHERE mem_id = c1.mem_id ; dbms_output.put_line(c1.mem_id || ' ==> ' || v_check1_info); WHEN OTHERS THEN dbms_output.put_line(c1.mem_id || ' ==> (' || SQLCODE || ')' SQLERRM); END; END LOOP; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('(' || SQLCODE || ')' SQLERRM); END; /