본문 바로가기

Database/PL SQL

PL/SQL Tutorial - Exception handlers

 프로그램은 진행도중 언제나 예외를 만나기 마련이다. PL/SQL에서도 예외들을 처리하기 위해 exception handlers를 제공한다. exception은 3가지 종류가 있다.

(1) 내부적으로 정의되어 있는 예외

(2) 미리 정의되어 있는 예외

(3) 유저 정의 예외

 

(1) Internally defined exceptions

 자주 만날 수 있는 ORA-n Error들이다. Oracle이 에러에 대한 판단을 내려주며 어떻게 해결해야하는지 알려준다.

DECLARE
   n_counter PLS_INTEGER;
BEGIN
   n_counter := 2147483648; -- overflow number
END;
오류 보고 -
ORA-01426: 수치 오버플로우

(2) Predefined exceptions

 어떠한 상황을 위해 미리 정해놓은 예외이다. 예제를 살펴보자.

DECLARE
  v_name VARCHAR2( 255 );
BEGIN
 
SELECT name INTO v_name 
FROM customers
WHERE customer_id = 0;
 
EXCEPTION
WHEN no_data_found THEN
  DBMS_OUTPUT.PUT_LINE( SQLERRM );
END;

익명 블록이 완료되었습니다.
ORA-01403: 데이터를 찾을 수 없습니다.

exception으로 when을 걸어놓았다. 만약 exception이 없다면 어떻게 될까?

DECLARE
  v_name VARCHAR2( 255 );
BEGIN
 
SELECT name INTO v_name 
FROM customers
WHERE customer_id = 0;

END;

01403. 00000 -  "no data found"

data가 존재하지 않아 select 에러가 나타난다. 이는 exception에서 걸러준 에러와 같은 내용이지만 형태가 다르다.

(3) User-defined exceptions

 이 exception은 사용자 블록 외에서 정의된 에러이다. 

DECLARE
    exception_name EXCEPTION;
    PRAGMA EXCEPTION_INIT (exception_name, error_number);

잘 이해안가니 직접 사용해보도록 한다.

DECLARE
  table_exists EXCEPTION;
  PRAGMA EXCEPTION_INIT( table_exists,  -955 );
  sql_stmt VARCHAR2( 200 ) := 'CREATE TABLE customers( customer_id number)';
BEGIN
 EXECUTE IMMEDIATE sql_stmt;
 EXCEPTION 
  WHEN table_exists THEN
     DBMS_OUTPUT.PUT_LINE( SQLERRM );
END;

익명 블록이 완료되었습니다.
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.

user는 table_exists 라는 exception을 정해주고 error number를 생성해준다. 이후 create table을 통해 결과값을 반환받는다. 테이블이 이미 존재하고 있어서 sqlerrm이 error message를 반환해준다. 이렇게 유저가 직접 만들어주는 error를 뜻한다.

Raising exceptions

EXCEPTION 
    WHEN exception_name WHEN 
        -- handle exception here    
        RAISE;

RAISE [exception_name];

정의되어 있는 사용자 예외에 raise를 사용해 정보를 확인할 수 있다.

'Database > PL SQL' 카테고리의 다른 글

PL/SQL Tutorial - Cursor  (0) 2019.05.08
PL/SQL Tutorial - SELECT INTO  (0) 2019.05.08
PL/SQL Tutorial - CONTINUE  (0) 2019.05.08
PL/SQL Tutorial - LOOP  (0) 2019.05.08
PL/SQL Tutorial - NULL  (0) 2019.05.07