프로시져 조언을 부탁합니다. 0 4 6,695

by 왕보초 프로시져 오라클 [2017.10.19 02:22:32]


안녕하세요.

암호한 필드를 디코드할때 오류를 발생한 필드를 다시 암호화 하여 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;

 

-----------------------------------------------------------------------------------------------------

 

by jkson [2017.10.19 08:20:10]

일단은 프로시저 구조 자체가 아주 비효율 적이네요.

120만번 loop를 돌면서 매번 TBUSERINFO 테이블을 읽고 rownum을 지정한 다음

해당 순번의 자료를 가지고 오는데..

이러면 엄청 성능이 안 좋을 것이고요.

TBUSERINFO 테이블 자료가 120만개가 되지 않으면

나머지 loop는 전혀 필요 없게 되네요.

TBUSERINFO테이블을 cursor로 처리하시는 게 나아보입니다.

그리고 자바 오류는 왜 나는 것인지 확실하지는 않지만

exception 구문의 update 문에서 뭔가 오류가 난 것이 아닌가 하는데

혹시 mem_name 필드가 not null 필드인데 null로 update하는 경우가 생기지 않는지 검토해보세요.


by 왕보초 [2017.10.19 13:41:20]

답변 감사합니다.

그리고 이 프로그램 취는 암호된 필드가 복화시 오류시 임시 글자를 암호화하여 업데이트하여 리스트 조회 시 오류발생을 막기위한 임시 위한 프로시져 입니다.


by 마농 [2017.10.19 08:21:20]
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;
/

 


by 왕보초 [2017.10.19 13:39:27]

매번 답변 정말 감사합니다

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