A>예외
오라클 예외와 사용자 정의 예외가 있다.
1.오라클 예외
오라클이 정의한 상황에서 자동 발생
예외명이 정해진것과 없는것이 있다.
2. 사용자 정의 예외
사용자가 예외처리를 정의
예외처리부에서 RAISE 문을 통해 명시적으로 예외를 발생시킨다.
B>종류
ACCESS_INTO_NULL
CASE_NOT_FOUND
COLLECTION_IS_NULL
CURSOR_ALREADY_OPEN :이미 커서가 열려있음
JUP_VAL_ON_INDEX: 인덱스 중복
INVALID_NUBER:문자 to 숫자 실패
등
C> 사용
주의점 : 예외 종류가 중복되면 안된다.
문형1.
DECLARE
BEGIN
실행문
실행문
EXCETPION
WHEN 오류 THEN 실행 내용
END;
문형2. 사용자 정의 오류
DECLARE
예외 이름 EXCEPTION; -- 예외 선언
PRAGMA EXCPETION_INIT(예외 이름, 지정 코드) --예외 초기화
BEGIN
실행문
실행문
EXCETPION
WHEN 오류 THEN 실행 내용
END;
예시1.
DECLARE
v_ename emp.ename%TYPE;
BEGIN
SELECT ename INTO v_ename FROM emp
WHERE ename LIKE'A%';
DBMS_OUTPUT.PUT_LINE('사원명 '||v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('해당 사원 없음' );
WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('사원 두명 이상' );
END;
예시2. 사용자 정의 예외
DECLARE
sawon_exist EXCEPTION;
PRAGMA EXCEPTION_INIT(sawon_exist,-2292); --예외 초기화 진행(예외이름, 예외번호)
--PRAGMA 는 의사명령어로 , 명령문이 컴파일러 지시어임을 의미
--블록실행시 처리되지 않음
BEGIN
DELETE FROM dept
WHERE deptno = &dno;
COMMIT;
EXCEPTION
WHEN sawon_exist THEN
DBMS_OUTPUT.PUT_LINE('사원이 존재합니다');
END;
C>RAISE 를 이용한 예외처리
RAISE는 예외를 일으킬 수 있다.
예시1.
DECLARE
v_empno emp.empno%TYPE;
v_no emp.empno%TYPE;
no_empno EXCEPTION; --EXCEPTION 선언
BEGIN
DELETE FROM emp WHERE empno = &empno;
IF SQL%NOTFOUND THEN RAISE no_empno; --예외 불러오기
END IF;
EXCEPTION --예외 처리 수행문
WHEN no_empno THEN
DBMS_OUTPUT.PUT_LINE('사원 업음');
END;
예시2. RAISE_APPLICATION_ERROR 프로시져를 이용한 예외처리
첫번째 매개변수 숫자는 20000 ~20999 까지
DECLARE
v_empno emp.empno%TYPE;
v_no emp.empno%TYPE;
no_empno EXCEPTION;
BEGIN
DELETE FROM emp WHERE empno = &empno;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20100,'존재 하지 않는 사번');
END IF;
END;
'DB관련 > oracle' 카테고리의 다른 글
서브 프로그램 - 내장함수(FUNCTION) (0) | 2021.01.21 |
---|---|
서브 프로그램 - 프로시져(PROCEDURE) (0) | 2021.01.21 |
PL/SQL -4 CURSOR (0) | 2021.01.21 |
PL/SQL 3- 복합 변수, 제어문 (0) | 2021.01.20 |
PL/SQL -2 스칼라 변수 (0) | 2021.01.20 |