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 |