pl/sql procedure 반복 처리 질문드립니다. 0 2 4,316

by 푸른기린 pl/sql [2011.11.07 12:45:52]



CREATE OR REPLACE PROCEDURE S_MIGLIFE.SP_CODE_COUNT
AS
    V_SYS_NAME VARCHAR2(100);
    V_SEQ    NUMBER;
    V_TABLE_NAME   VARCHAR2(300);
    V_COL_NAME VARCHAR2(300);
    V_CODE_ID_NAME  VARCHAR2(300);
    V_QUERY    VARCHAR2(4000);
   
   
BEGIN
--   DBMS_OUTPUT.ENABLE();
--   DBMS_OUTPUT.put_line('Start....');

   /* 시스템별 MAX 회차 구하기 */
    SELECT NVL(MAX(ASIS_SYS_SEQ),0)+1
   INTO V_SEQ
  FROM A_MIG_ANAL_RSLT_CD;

    DECLARE
    CURSOR C_TAB IS  
   
    SELECT AS_IS_SYSTEM_NM, AS_IS_TAB_NM_ENG, AS_IS_COL_ENG, AS_IS_CODE_IDENT_NM
  FROM A_MIG_META_ASIS_COL
    WHERE (AS_IS_TAB_NM_ENG, AS_IS_COL_ENG) NOT IN
    (SELECT *
    FROM A_NOT_EXISTS_META_COL)
AND AS_IS_SYSTEM_NM = 'LIFE38'
AND AS_IS_CODE_IDENT_NM IS NOT NULL
AND AS_IS_CODE_IDENT_NM = TRIM(AS_IS_CODE_IDENT_NM)
ORDER BY 1,2,3,4;

    BEGIN
  OPEN C_TAB;

  LOOP

FETCH C_TAB INTO V_SYS_NAME,V_TABLE_NAME, V_COL_NAME, V_CODE_ID_NAME;
EXIT WHEN C_TAB%NOTFOUND;

V_QUERY := 'INSERT INTO A_MIG_ANAL_RSLT_CD SELECT '''||V_SYS_NAME||''','||''''||V_SEQ||''','||''''||V_TABLE_NAME||''', '||'''' ||V_COL_NAME||''', '||''''||V_CODE_ID_NAME||''', '||'NVL('||V_COL_NAME||','||'''NULL VALUE'')'||', COUNT(*), SYSDATE FROM ' || V_TABLE_NAME || ' GROUP BY '|| V_COL_NAME;
DBMS_OUTPUT.PUT_LINE(V_QUERY);
 
EXECUTE IMMEDIATE V_QUERY ;
  
COMMIT;
  
  END LOOP;
  CLOSE C_TAB;
 
   END;  
END SP_CODE_COUNT;
/


이렇게 프로시져를 만들었는데, 에러 발생시 에러를 뱉어내고 프로시저를 종료하는것이 아니라, 

   EXCEPTION
    WHEN OTHERS THEN
   
    ERR_MSG := SQLERRM;
    BEGIN
    INSERT INTO A_MIG_ANAL_RSLT_CD_LOG
    VALUES (V_SYS_NAME, V_SEQ, V_TABLE_NAME, V_COL_NAME, V_CODE_ID_NAME, ERR_MSG, SYSDATE);
    END;    
END;

예외처리를 이용하여 에러 적재 후, 다시 다음 문장부터 처리를 하려고 합니다.
김정식님이 쓰신 pl/sql 관련 도움 자료를 찾아보았으나,
처리하기가 쉽지 않았습니다.

무엇보다, 예외처리가 마지막에 붙어야하는 제약때문이지
제대로 쓰기가 어렵습니다.


어떻게 처리하는게 효율적이고 정확할지 도움을 청합니다.

by 마농 [2011.11.07 13:06:47]
Begin End 는 크게 한개만 사용가능한게 아닙니다.
큰 Begin 안에 작은 Begin 이 와도 무방합니다.
Loop 문 안에서 Begin ~ Exception ~ End 하세요.

by 푸른기린 [2011.11.07 13:31:12]
마농님 감사합니다.
할 일은 태산인데 기초가 없으니, 많이 힘드네요.
감사합니다.^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입