1. Procedure에서 Exception 처리
DECLARE
V_EXCEPTION EXCEPTION;
V_NUM NUMBER := 0;
BEGIN
FOR V_ROW IN (SELECT LEVEL AS SEQ FROM DUAL CONNECT BY LEVEL <= 10)
LOOP
BEGIN
V_NUM := MOD(V_ROW.SEQ, 5);
IF V_NUM = 0 THEN RAISE V_EXCEPTION; END IF;
DBMS_OUTPUT.PUT_LINE('출력 : ' || V_ROW.SEQ || ' : ' || V_NUM);
EXCEPTION
WHEN V_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('1. 예외 : ' || V_ROW.SEQ || ' : ' || V_NUM);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('2. 예외 : ' || V_ROW.SEQ || ' : ' || V_NUM);
END;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('3. 예외 : ' || SQLERRM);
END;
/
2. Procedure에서 RAISE_APPLICATION_ERROR 처리
BEGIN
FOR V_IDX IN 1 .. 10
LOOP
BEGIN
IF V_IDX = 5 THEN
RAISE_APPLICATION_ERROR(-20000, '에러!');
END IF;
DBMS_OUTPUT.PUT_LINE(V_IDX);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(V_IDX || ' : ' || SQLERRM);
END;
END LOOP;
END;
1
2
3
4
5 : ORA-20000: 에러!
6
7
8
9
10
3. Function에서 RAISE_APPLICATION_ERROR 처리
CREATE OR REPLACE FUNCTION GET_ROW_INFO ( P_ROW_NO IN VARCHAR2) RETURN ROW_INFO
IS
V_ROW_NO VARCHAR2(100);
V_ROW_NM VARCHAR2(100);
V_ROW_INFO ROW_INFO := ROW_INFO(NULL, NULL, NULL, NULL);
BEGIN
SELECT *
INTO V_ROW_NO
, V_ROW_NM
FROM XXXX
WHERE...
;
IF V_ROW_NO IS NULL THEN
RAISE_APPLICATION_ERROR(-20000, 'ROW_NO에 데이터가 없습니다.');
END IF;
IF V_ROW_NM IS NULL THEN
RAISE_APPLICATION_ERROR(-20000, 'ROW_NM에 데이터가 없습니다.');
END IF;
RETURN V_ROW_INFO;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ROW_NO : ' || P_ROW_NO || ' => ' || SQLERRM);
RAISE_APPLICATION_ERROR(-20000, 'ROW_NO : ' || P_ROW_NO || ' => ' || SQLERRM); <-- 이구문이 있으면 그냥 실행으로도(DBMS출력 없이)Exception Throw한다.
RETURN NULL;
END;