ORACLE PL/SQL의 에러 처리방법

2013.12.27 19:54

가을의곰을... 조회 수:4849



[출처] http://radiocom.kunsan.ac.kr/lecture/oracle/plsql/plsql_exception.html

PL/SQL의 에러 처리방법



경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

PL/SQL 블럭 내에서 SQL문을 정상적으로 처리하지 못하여 발생하는 오류는 프로그램내에 에러를 직접 처리해 주어야 한다.
PL/SQL 블럭 내에 사용된 SQL문의 에러 처리는 EXCEPTION절에 정의하면 된다.

• 미리정의된 에러처리방법
• 미리 정의되지 않은 에러 처리방법
• 사용자가 정의한 에러 처리방법
• 예외 trapping 함수

	declare
          ....
        begin
          ....
        exception
          ....
        end;


미리 정의된 에러 처리방법

오라클에서 제공하는 예측하여 정의한 오류 목록은 다음과 같다.

항목에러 코드설명
NO_DATE_FOUNDORA-01403 SQL문에 의한 검색조건을 만족하는 결과가 전혀 없는 조건의 경우
NOT_LOGGED_ONORA-01012 데이터베이스에 연결되지 않은 상태에서 SQL문 실행하려는 경우
TOO_MANY_ROWSORA-01422 SQL문의 실행결과가 여러 개의 행을 반환하는 경우, 스칼라 변수에 저장하려고 할 때 발생
VALUE_ERRORORA-06502 PL/SQL 블럭 내에 정의된 변수의 길이보다 큰 값을 저장하는 경우
ZERO_DEVIDEORA-01476 SQL문의 실행에서 컬럼의 값을 0으로 나누는 경우에 발생
INVALID_CURSORORA-01001 잘못 선언된 커서에 대해 연산이 발생하는 경우
DUP_VAL_ON_INDEXORA-00001 이미 입력되어 있는 컬럼 값을 다시 입력하려는 경우에 발생

 
【예제】
$ vi zz.sql

CREATE OR REPLACE PROCEDURE test
(v_sal IN emp.sal%TYPE)
IS
  v_ename  emp.ename%TYPE;
BEGIN
  SELECT ename INTO v_ename FROM emp WHERE sal=v_sal;
  dbms_output.put_line('He id '¦¦ v_ename ¦¦'!!!!');
EXCEPTION
  WHEN no_data_found THEN
   raise_application_error(-20002,'Data not found....');

  WHEN too_many_rows THEN
   raise_application_error(-20003,'Too Many Rows....');

  WHEN others THEN
   raise_application_error(-20004,'Others Error....');

END;
/
SQL> start zz.sql 프로시저가 생성되었습니다. SQL> set serveroutput on SQL> execute test(9000); BEGIN test(9000); END; * 1행에 오류: ORA-20002: Data not found.... ORA-06512: "SCOTT.TEST", 줄 10에서 ORA-06512: 줄 1에서 SQL>

미리 정의되지 않은 에러 처리방법 미리 정의된 에러 처리방법외에 사용자가 직접 에러 처리에 대한 논리적 흐름을 구현할 수 있다.
[PRAGMA EXCEPTION]절은 오라클 서버에서 어떤 에러 코드가 발생할 때 정의한 조건명을 지정할 것인지를 정의하는 절이다.
【예제】
$ vi zz.sql

 create or replace procedure hire_emp
(v_emp_name     IN emp.ename%type,
 v_emp_job      IN emp.job%type,
 v_mgr_no       IN emp.mgr%type,
 v_emp_hiredate IN emp.hiredate%TYPE,
 v_emp_sal      IN emp.sal%type,
 v_emp_comm     IN emp.comm%type,
 v_dept_no      IN emp.deptno%type)
IS
 e_invalid_mgr exception;

pragma exception_init (e_invalid_mgr, -02291);

BEGIN
  INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm,deptno)
   values(emp_id.nextval, v_emp_name, v_emp_job,v_mgr_no, v_emp_hiredate,
          v_emp_sal, v_emp_comm, v_dept_no);
  commit work;
  exception
   when e_invalid_mgr then
    raise_application_error(-20201, 'Deptno is not a valid department.');
end hire_emp;
/ 
SQL> create sequence emp_id start with 80; 시퀀스가 생성되었습니다. SQL> 먼저 emp,dept 테이블의 deptno 컬럼에 promary key와 foreign key조건의 제약조건을 설정한다 SQL> alter table dept add constraint dept_deptno_pk primary key(deptno); SQL> alter table emp add constraint deptno_emp_fk foreign key(deptno) references dept(deptno); SQL> execute hire_emp('STONE','CLERK',9000, SYSDATE, 950, 300,44) BEGIN hire_emp('STONE','CLERK',9000, SYSDATE, 950, 300,44); END; * 1행에 오류: ORA-20201: Deptno is not a valid department. ORA-06512: "SCOTT.HIRE_EMP", 줄 21에서 ORA-06512: 줄 1에서 SQL>

사용자가 정의한 에러 처리방법

사용자가 미리 에러에 대한 정의를 하는 경우이며, EXCEPTION 키워드에 의해 에러 조건명을 정의하고 RAISE 명령어에 의해 에러가 발생되면 exception 절에서 에러가 처리된다.

【예제】
$ vi test5.sql

create or replace procedure test5
(v_sal  IN emp.sal%TYPE)
IS
 v_low_sal      emp.sal%type := v_sal - 100;
 v_high_sal     emp.sal%type := v_sal + 100;
 v_no_emp       number(7,2);

 e_no_emp_returned 	exception;
 e_more_than_one_emp 	exception;

begin
 select count(ename) into v_no_emp from emp
  where sal between (v_sal - 100) and (v_sal + 100);
 if v_no_emp = 0 then
    raise e_no_emp_returned;
  elsif v_no_emp > 0 then
    raise e_more_than_one_emp;
 end if;

exception
 when e_no_emp_returned then
   dbms_output.put_line('There is no employee salary...');
 when e_more_than_one_emp then
   dbms_output.put_line('There is a row employee....');
 when others then
   dbms_output.put_line('Any other error occurred......');
end;
/ 
SQL> start test5.sql 프로시저가 생성되었습니다. SQL> set serveroutput on SQL> execute test5(9000) There is no employee salary... PL/SQL 처리가 정상적으로 완료되었습니다. SQL>

예외 trapping 함수

이 방법은 사용자가 실행한 SQL 문이 실행될 때 어떤 에러 코드와 에러 메시지가 발생하는지를 사용자가 직접 참조하여 처리하는 방법이다.
SQL 문을 실행한 후, SQLCODE 함수를 참조해 보면 SQL문의 실행 결과를 알 수 있다.

• SQLERRM 함수에는 SQLCODE에 대한 메시지가 저장되어 있다.
• error_code는 -20000 ∼ -20999는 사용자가 직접 정의할 수 있다.

SQLCODE값의 이미는 다음과 같다.

0에러 없이 정상적으로 실행되었음을 의미
1사용자가 정의한 에러가 발생했음을 의미
+100조건을 만족하는 행이 없음을 의미
양수값 다른 오라클 에러가 발생했음을 의미

【예제】
$ vi test7.sql

CREATE OR REPLACE PROCEDURE test7
(v_sal  IN emp.sal%TYPE)
IS
 v_ename        emp.ename%TYPE;
 v_err_code     number;
 v_err_message  varchar(255);

begin
 select ename into v_ename from emp
  where sal = v_sal;
   dbms_output.put_line('He is '¦¦ v_ename ¦¦ '....');

exception
 WHEN no_data_found THEN
   v_err_code    := SQLCODE;
   v_err_message := SQLERRM;

   dbms_output.put_line(v_err_code ¦¦ '   ' ¦¦ v_err_message);
 WHEN too_many_rows THEN
   raise_application_error(-2003, 'Too Many Rows...');
 WHEN others        THEN
   raise_application_error(-2004, 'Others Error...');
END;
/ 
SQL> start test7.sql 프로시저가 생성되었습니다. SQL> set serveroutput on SQL> execute test7(9000) 100 ORA-01403: 데이터를 찾을 수 없습니다. PL/SQL 처리가 정상적으로 완료되었습니다. SQL>




본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86127
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78632
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95352
83 전사아키텍처 프레임워크 개념 file 졸리운_곰 2014.06.05 2608
82 전사아키텍처 개념 file 졸리운_곰 2014.06.05 2149
81 [데이타모델링실무] 연습문제풀이 2014-04-15 [화] secret 졸리운_곰 2014.04.15 0
80 2014-04-14~18 데이타베이스진흥원 : 데이타베이스모델링 교육 secret 졸리운_곰 2014.04.14 0
79 Oracle DECODE문을 IF문처럼 사용하기. 졸리운_곰 2014.01.25 2472
78 [ORACLE] NVL함수 & DECODE함수 졸리운_곰 2014.01.25 2468
77 ※ Oracle 오라클 DECODE 함수 file 졸리운_곰 2014.01.25 2770
76 오라클 백업 및 복구(Datapump) 졸리운_곰 2014.01.25 2122
75 (Oracle) delete 복구 졸리운_곰 2014.01.25 2421
74 오라클 쿼리 복구 졸리운_곰 2014.01.25 3450
73 오라클 플래쉬백 사용하기(Flashback Query) 졸리운_곰 2014.01.25 2603
72 체크 제약조건 적용사례 졸리운_곰 2014.01.19 3169
71 유용한 오라클 쿼리 – 코멘트 조회 등 졸리운_곰 2014.01.02 4953
70 계층구조 쿼리의 활용 졸리운_곰 2014.01.02 3353
» PL/SQL의 에러 처리방법 가을의곰을... 2013.12.27 4849
68 PL/SQL 예외 처리 가을의곰을... 2013.12.27 3375
67 [PLSQL] 상수와 변수 가을의곰을... 2013.12.27 4442
66 ORCLE 문자열을 숫자로, 숫자를 문자로, TO_CHAR(), TO_NUMBER() 가을의곰을... 2013.12.27 4797
65 PL_SQL 1일차 file 가을의곰을... 2013.12.27 4528
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED