Information Technology

Oracle PL/SQL Exception

지에또일 2010. 3. 31. 10:09


-----------------------------------------------------------------------------
출처: http://cafe.naver.com/litave.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=39
-------------------------------------------------------------------

<<== 목차==>>

  3. Exception
  4. Pre defined Exception
    NO_DATA_FOUND, TOO_MANY_ROWS, INVALID_CURSOR, ZERO_DIVIDE, DUP_VAL_ON_INDEX
  5. 미리정의되지않은Exception
    PRAGMA EXCEPTION_INIT
  6. 사용자가정의한예외사항
  7. when others then

--------------------------------------------------------------------

1. 오라클dbms 종료하기
  - shutdown abort
  - 휴지인스턴스라는말은: DBMS가아직구동되지않은상태이다.
  - ORACLE not available : 오라클을사용할수없는상태이다.
  - 오라클은130여가지이상의옵션을가지고있다.


2. 지난주금요일과제
    Set serveroutput on
    declare
      Cursor  c1 is
        Select ename, sal from emp;
        sumsal number := 0;
   
    begin
      for c2 in c1 loop
        sumsal := sumsal + c2.sal;
        dbms_output.put_line(c2.ename || ' ' || to_char(c2.sal) || ' ' || to_char(sumsal));
      end loop;
   
    end;
    /
   
    Set serveroutput off
   
    - 프로시저: 어떤작업을수행하는것
    - 함수: 값을돌려주는것
    - 위의것을프로시져나함수로만들어서오라클내에서사용가능하다.

 

3. exception(예외처리)
  - 정해진규칙이외의것들은어떻게처리할것이다.
  - 예외들을규정하고모아놓은것들을Exception이라고한다.
 
  Execption의종류
  1) 미리정의된Exception
    - 오라클내에서자주일어나서만들어놓은


  2) 미리정의되지않은Exception
    - 오라클내에서자주일어나지않지만가끔일어나므로가져다사용할수있도록해놓은것


  3) 사용자정의Exception
    - 자신이프로그램해놓은프로그램내에서필요에따라만들어서쓰는것.

 

4. 미리정의된Exception
  - 숫자를입력받기를기대하지만한글로입력한다던지의전혀예상치못한입력에대해서처리하는것.
  - 동작중에러(ORA- )가나면바로해당위치에서Exception part로제어권이넘어간다.
  - 해당Exception 이존재하는지확인해서에러메세지대신에Exception에정의된부분을수행한다.(별도의메세지출력이나다른결과리턴)
  1) NO_DATAFOUND
    - 쿼리의검색결과가하나도없을때발생하는Exception
  2) Exception 파트에해당하는것이없다면, 에러메세지가쫘악나오게된다.
  3) 첨부자료page 11 참조
 
  4) TOO_MANY_ROWS
    - 쿼리문의실행결과가변수에담을수없을정도로너무많을때발생
 
  5) INVALID_CURSOR
    - 커서를만들때잘못만들면발생(해당TABLE이없다든지)
  6) ZERO_DIVIDE
    - 문장중에0으로나누는문장이있을때발생
  7) DUP_VAL_ON_INDEX
    - 인덱스에중복된값이있을때발생하는Exception
    - 제약조건검사시일단해당Data를집어넣고검사한다.
 
  8) Oracle 메뉴얼보면발생하는Exception과사용방법이나와있다.

 

5. 미리정의되지않은Exception은어떻게할것인가?
  - 미리모두만들어놓으면엔진이무거워진다.
  - 변수선언위치에exception이라고적어준면된다.(변수명exception)
  - 해당변수를exception으로하겠다.
  - ORA-몇번과같은Exception이라고정의하는것이다.(PRAGMA EXCEPTION_INIT 변수명, 번호)
  - 사용방법은미리정의된Exception이랑같다.
  - 사용자가만든예외사항과오라클에서만든것과같은것이다. 라고연결하는역할을한다.

 

6. 사용자가정의한예외사항
  - ORA- 에도없는Exception을만들경우
  - 제약사항(Constraint)에관련된것들은정의된예외사항에없다.
  - 기존에는Sal의범위를check를통해서처리했으나이것을예외처리로처리할수도있다.
  - 예외처리는오라클내부에러가아니므로, 강제로발생시킬수도있으며, 정의해서해당상황이발생시에처리할수있다.
  - Begin 부분에서강제로Exception 발생하는부분이필요하다.

 
7. when others then
  - Exception을수십가지를모두만들어서넣었다.
  - 그리고실행하면, 말도안되는사용자가나와서이상한짓하면에러메세지가또발생할수있다.
  - 그래서대표이름을줄수있다.
  - when others then 을사용하면, 정의되어있는Exception이외의것이발생하는모든예외에대해서처리할수있다.
  - 만약when others then이제일아래에있지않고, 중간쯤에있으면다른Exception은무시된다.

  1) 회사사용예
    when others then
      Rollback;
      v_er := SQLCODE;
      v_errm := SQLERRM;
      Insert into errs
        values(Sysdate, v_er, v_errm);
      Commit;
      dbms_output.put_Line('관리자에게문의하세요');
      dbms_output.put_Line('Tel : xxx-xxxx, 구내번호: xxx');

 

  2) SQLCODE : 현재에러발생번호를담고있는변수(평상시에아무값도안가지고있음)
     SQLERRM : 현재발생한에러메세지를담고있다.
     errs : Table 명
     - 에러메세지와발생시간을확인할수있도록해야한다.
     - 이렇게하면유지보수의의미도갖는다.