CREATEOR REPLACE PROCEDURE upload_jobid_proc ( p_employee_id employees.employee_id%TYPE , p_job_id jobs.job_id%TYPE) IS vn_cnt NUMBER :=0; BEGIN SELECTCOUNT(*) INTO vn_cnt FROM JOBS WHERE JOB_ID = p_job_id;
IF vn_cnt =0THEN DBMS_OUTPUT.PUT_LINE('job_id가 없습니다.'); RETURN; ELSE UPDATE employees SET job_id = p_job_id WHERE employee_id = p_employee_id; END IF; COMMIT; END;
EXEC upload_jobid_proc(200,'TEST_ID');
두번째 방법은 앞서 정리한 예외처리로도 구현할 수 있다. NO_DATA_FOUND 라는 예외를 사용하여 구현할 수도 있다.
CREATEOR REPLACE PROCEDURE upload_jobid_proc ( p_employee_id employees.employee_id%TYPE , p_job_id jobs.job_id%TYPE) IS vn_cnt NUMBER :=0; BEGIN SELECTCOUNT(*) INTO vn_cnt FROM JOBS WHERE JOB_ID = p_job_id;
UPDATE employees SET job_id = p_job_id WHERE employee_id = p_employee_id; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('기타 에러 : '|| SQLERRM); END;
사용자 정의 예외
사용자 정의 예외를 사용하려면 변수처럼 PL/SQL 블록의 선언부에 예외를 정의해야 한다.
시스템 예외는 해당 예외가 자동으로 검출되지만, 사용자 정의 예외는 직접 예외를 발생시켜주어야 한다.
CREATEOR REPLACE PROCEDURE upload_jobid_proc ( p_employee_id employees.employee_id%TYPE , p_job_id jobs.job_id%TYPE) IS vn_cnt NUMBER :=0; ex_invalid_depid EXCEPTION; -- 사용자 정의 예외 선언 BEGIN SELECTCOUNT(*) INTO vn_cnt FROM JOBS WHERE JOB_ID = p_job_id;
IF vn_cnt =0THEN RAISE ex_invalid_depid; -- 사용자 정의 예외 발생 END IF;
UPDATE employees SET job_id = p_job_id WHERE employee_id = p_employee_id; COMMIT; EXCEPTION WHEN ex_invalid_depid THEN-- 사용자 정의 예외처리 DBMS_OUTPUT.PUT_LINE('존재하지 않는 job_id 입니다.'); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('기타 에러 : '|| SQLERRM); END;
사용자 정의 예외명과 예외 코드 연결하기
프로시저 선언부에서 PRAGMA EXCEPTION_INIT 명령어를 통해서 예외코드와 사용자예외를 매핑할 수 있다.
1 2 3 4 5
-- 선언부 IS ex_invalid_depid EXCEPTION; PRAGMA EXCEPTION_INIT (ex_invalid_depid , -1913); -- ORA-1913 BEGIN
주의할점은 당연한 말이지만 동일한 예외코드를 여러개의 예외에 매핑할 수 없다. 또한 예외코드 100 이하는 사용할 수 없다.
RAISE_APPLICATION_ERROR
RAISE 이외에도 사용자 정의 예외를 명시적으로 터트릴 수 있는 시스템 프로시저이다.
선언부에 사용자 정의 예외를 명시할 수 없이 다음과 같이 사용하면 된다.
1
RAISE_APPLICATION_ERROR(-20000, '양수만 입력받을 수 있습니다.');
1 2 3 4 5 6 7 8 9 10 11 12
CREATEOR REPLACE PROCEDURE raise_test_proc(p_num NUMBER) IS v_num NUMBER; BEGIN v_num := p_num; IF v_num <0THEN RAISE_APPLICATION_ERROR(-20000, '양수만 입력해주세요'); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE); -- -20000 END;
만약 입력값이 음수면 RAISE_APPLICATION_ERROR 를 통해 -20000 예외코드에 예외 메시지는 ‘양수만 입력해주세요’ 로 사용자 정의 예외가 터지고, 이를 예외 처리부에서 잡아서 처리한다.
예외코드는 -20000 ~ -20999 번까지만 사용 가능하며 , 이 이유는 이외의 코드들은 Oracle에서 시스템 예외들이 사용하지 않는 코드들이기 때문이라고 한다.