CREATE OR REPLACE PROCEDURE PROCEDURE1AS V_CNTR_NO VARCHAR2(13) ; V_ITEM_CD VARCHAR2(13) ;BEGIN DBMS_OUTPUT.PUT_LINE('시작.') ; BEGIN SELECT CNTR_NO INTO V_CNTR_NO FROM TB_OD_CNSGN_FEE; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('계약번호가 없습니다.') ; WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('계약번호가 두건 이상입니다.') ; END; DBMS_OUTPUT.PUT_LINE('중간.') ; BEGIN SELECT ITEM_CD INTO V_ITEM_CD FROM TB_OD_CNSGN_FEE; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('아이템코드가 없습니다.') ; WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('아이템코드가 두건 이상입니다.') ; END; DBMS_OUTPUT.PUT_LINE('끝.') ; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('TOP EXCEPTION.') ;END PROCEDURE1;-------실행결과----------------------------계약번호가 두건 이상입니다.아이템코드가 두건 이상입니다.끝.프로세스가 종료되었습니다.
보통 EXCEPTION 처리를 위와 같이 중첩 블록을 사용하였다.
문제는 EXCEPTION이 발생하여도 해당 블록만 멈추고 다음으로 계속 진행을 한다.
자바와는 다르다.
그래서 각 블록마다 RAISE_APPLICATION_ERROR를 발생시키거나, 메인 블록만 남기는 방법을 선택해야 한다.