본문 바로가기

Oracle/오라클 양성반 15기

pl/sql exception


Exception

PL/SQL을 작성할때 예기치 않은 오류를 발생할경우 처리할수있는 구문

일반 개발언어의

exception , try catch 구문과 흡사하다.

 

PL/SQL내에서

여러가지 복잡한 조건을 처리하다보면 생각하지 못했던 오류들이 발생할수있다.

또한 그런 오류가 발생했을때 사용자가 오류화면만 보고 아무것도 알지 못하는 상황이 발생하게 될수가 있기때문에

 

PL/SQL내부에서 작성자가 예상할수있는 부분을 예외처리를 통해서

그 예외가 발생했을때 무슨일이 있어도 어떠한 액션을 취하게끔 해주는 역할을 한다.

 

예를 들면

누군가 인터넷 뱅킹으로 100만원을 입금하고있다.

프로그램 내부에서는 어떤 입금관련 sql이 실행되고있다. (물론 이 sql은 pl/sql로 작성되어있다.)

그런데 예기치 못하게 내부에서 오류가 발생을 했다.

그러면 트랜잭션은 시작은 되었으나 종료를 하지 못하고 계속 대기상태가 되버린다.

 

어느정도 예상할수있는 또는 예상할수없는 상황 ( 개발자도 사람이기에 모든 상황을 완벽하게 파악을 하지 못한다. )

등을 처리하기위해서

exception 을 두어 알수없는 exception이 발생하면

rollback 을 하도록 처리한다.

 

그러면 데이터는 문제가 없어지고 , 트랜잭션도 이상없이 종료가 된다.

 

 

* 일반적인 사용방법 1

( ORACLE에서 제공하는 기본적인 메세지를 활용 하고 싶을때 )

declare
    v_val employees.employee_id%type;
begin
   
    /* SQL 작성부분 */
    
   /* 없는 데이터를 조회 */
   select
        employee_id into v_val
   from
        employees
   where
        employee_id = 1999;
     
    
    /* 예외 처리 */
    exception
        when NO_DATA_FOUND then
        dbms_output.put_line('NO_DATA');
       
end;
/

결과) NO_DATA

ORA-XXXXX의 오류가 나지 않고 해당 exception 의 NO_DATA_FOUND 에 적용되어 관련 메세지가 출력.

 

* 일반적인 사용방법 2

( 임의 exception을 정의하여 PL/SQL개발자가 직접 특정 부분에서 exception 을 발생시키고 싶을때 )

declare

    v_test_exp1 exception;
  
begin
   
    /* SQL 작성부분 */
    IF 5 > 3 THEN
    raise v_test_exp1; -- raise 해당 exception 발생시킴
    END IF ;
   
    /* 예외 처리 */
    exception
        when v_test_exp1 then
        dbms_output.put_line('v_test_exp1 ====> '||SQLCODE||'--'||SQLERRM);
        when others then
        dbms_output.put_line(q'[I don't know]');
       
end;
/

결과)v_test_exp1 ====> 1--User-Defined Exception

* ORA-00000 의 에러 발생을 예외처리하는예제)

(오라클 오류발생을 PL/SQL에서 개별 사용자메세지로 보여주고 싶을때.)

declare

    v_test_exp1 exception;
    pragma exception_init(v_test_exp1, -01400);
    /* 오라클 01400 에러를 재정의 */
   
begin
   
    /*

    SQL 작성부분

    이미 있는 값을 넣어본다.

    */


    insert into jobs (job_id) values('AC_ACCOUNT');   -- 이부분에서 이미 있는 데이터를 입력해서 ORA-01400 에러를 발생
    
    /* 예외 처리 */
    exception
        when v_test_exp1 then
        dbms_output.put_line('v_test_exp1 ====> '||SQLCODE||'--'||SQLERRM);
        when others then
        dbms_output.put_line(q'[I don't know]');
       
end;
/

 

결과 ) v_test_exp1 ====> -1400--ORA-01400: cannot insert NULL into ("HR"."JOBS"."JOB_TITLE")

 

 

* ORA-XXXXX 의 오류를 직접 정의하고 싶을때

declare

    v_test_exp1 exception;
    pragma exception_init(v_test_exp1, -20991);
  
begin
   
    /* SQL 작성부분 */
   
  
   
    IF 5 > 3 THEN
    raise v_test_exp1;
    END IF ;
   
    /* 예외 처리 */
    exception
        when v_test_exp1 then
        raise_application_error(-20991,'Test Message');
        
        when others then
        dbms_output.put_line(q'[I don't know]');
       
end;
/

 

결과 ) ORA-20991: Test Message;

'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12