2014. 2. 17. 09:35

[오라클 / PL-SQL] 오라클 예외처리 및 기본 예제

CREATE OR REPLACE PROCEDURE SP_USER_CONTROL(   
    SEL_MODE IN VARCHAR2,
    P_X_ID IN X_TEMP_TABLE.X_ID%TYPE,
    P_X_PW IN X_TEMP_TABLE.X_PW%TYPE,
    ERROR_CODE OUT VARCHAR2, --에러코드 리턴
    ERROR_MSG OUT VARCHAR2 --에러메시지
)IS
    V_ERROR_CODE VARCHAR2(30); --예외코드 변수
    V_ERROR_MSG VARCHAR2(1000); --예외메시지 변수
    V_CNT NUMBER;
    CALLEXT EXCEPTION; --사용자 예외 선언
BEGIN   
    IF SEL_MODE='1' THEN --INSERT
        DBMS_OUTPUT.PUT_LINE('INSERT');
        BEGIN
            INSERT INTO X_TEMP_TABLE VALUES(P_X_ID,P_X_PW);
            EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
                            V_ERROR_CODE:='E001';
                            V_ERROR_MSG:='중복된 데이터로 인해 입력에 실패하엿습니다.';
                            RAISE CALLEXT; --사용자 예외 던지기
                      WHEN OTHERS THEN
                            RAISE; --예외 던지기
        END;
    ELSIF SEL_MODE='2' THEN --UPDATE
        DBMS_OUTPUT.PUT_LINE('UPDATE');
        BEGIN           
            SELECT COUNT(*) INTO V_CNT FROM X_TEMP_TABLE WHERE X_ID = P_X_ID;
            IF V_CNT > 0 THEN
                UPDATE X_TEMP_TABLE SET X_ID = P_X_ID, X_PW = P_X_PW WHERE X_ID = P_X_ID;
            ELSE
               V_ERROR_CODE:='E002';
               V_ERROR_MSG:='대상 데이터가 검색되지 않앗습니다.';
               RAISE CALLEXT; --사용자 예외 던지기
            END IF;
           
            EXCEPTION WHEN OTHERS THEN
                      RAISE; --예외 던지기
        END;       
    ELSIF SEL_MODE='3' THEN --DELETE
        DBMS_OUTPUT.PUT_LINE('DELETE');
        BEGIN           
            SELECT COUNT(*) INTO V_CNT FROM X_TEMP_TABLE WHERE X_ID = P_X_ID;
            IF V_CNT > 0 THEN
                DELETE FROM X_TEMP_TABLE WHERE X_ID = P_X_ID;
            ELSE
               V_ERROR_CODE:='E002';
               V_ERROR_MSG:='대상 데이터가 검색되지 않앗습니다.';
               RAISE CALLEXT; --사용자 예외 던지기
            END IF;
           
            EXCEPTION WHEN OTHERS THEN
                      RAISE; --예외 던지기
        END;
    ELSIF SEL_MODE='4' THEN --TRUNCATE
        DBMS_OUTPUT.PUT_LINE('TRUNCATE');
        BEGIN           
            EXECUTE IMMEDIATE 'TRUNCATE TABLE X_TEMP_TABLE';
            EXCEPTION WHEN OTHERS THEN
                      RAISE; --예외 던지기
        END;
    ELSE
        RAISE CALLEXT;
    END IF;
   
    ERROR_CODE:='E000';
    ERROR_MSG:='정상적으로 처리되엇습니다.';
    COMMIT;
   
    EXCEPTION
        WHEN CALLEXT THEN --사용자 예외
             ERROR_CODE:=V_ERROR_CODE;
             ERROR_MSG:=V_ERROR_MSG;
             ROLLBACK;
        WHEN NO_DATA_FOUND THEN
             ERROR_CODE:='E002';
             ERROR_MSG:='데이터를 찾을수가 없습니다.';
             ROLLBACK;
        WHEN OTHERS THEN
             ERROR_CODE:='E004';
             ERROR_MSG:=SQLERRM || SQLCODE;   
             ROLLBACK;
END SP_USER_CONTROL;