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 관련 도움 자료를 찾아보았으나,
처리하기가 쉽지 않았습니다.
무엇보다, 예외처리가 마지막에 붙어야하는 제약때문이지
제대로 쓰기가 어렵습니다.
어떻게 처리하는게 효율적이고 정확할지 도움을 청합니다.