사용자 정의 예외 1 2 926

by 기린기린 [PL/SQL] [2020.07.07 13:26:18]


안녕하세요.

 

http://www.gurubee.net/lecture/1073

 

사용자 정의 예외를 발생시킬 때

 

ORA-20001: 부서에 사원이 몇명 안되네요..
ORA-06512: "SCOTT.USER_EXCEPTION", 줄 17에서
ORA-06512: 줄 1에서


이 부분에서 사용자 정의 예외로 명시한 첫 째 라인 오류만 발생시킬 수 있는 옵션 혹은 방법이 있나요?
오브젝트 및 참조라인을 보여줄 필요가 없고 사용자메시지만 보여주고 싶습니다.
오라클 버전은 10g 입니다.

감사합니다.

by pajama [2020.07.07 16:11:39]

EXCEPTION_INIT과 RAISE_APPLICATION_ERROR를 같이 쓰면 될듯합니다.

http://www.gurubee.net/lecture/1072

 

CREATE OR REPLACE PROCEDURE User_Exception 
        (v_deptno IN emp.deptno%type ) 
     IS

       -- 예외의 이름을 선언
       user_define_error EXCEPTION;     -- STEP 1
       cnt     NUMBER;
       PRAGMA EXCEPTION_INIT(user_define_error, -20001);

     BEGIN

       DBMS_OUTPUT.ENABLE;   

       SELECT COUNT(empno) 
       INTO cnt
       FROM emp
       WHERE deptno = v_deptno;

       IF cnt < 5 THEN
         -- RAISE문을 사용하여 직접적으로 예외를 발생시킨다
          RAISE_APPLICATION_ERROR(-20001, '부서에 사원이 몇명 안되네요..');     -- STEP 2
       END IF;

      EXCEPTION
        -- 예외가 발생할 경우 해당 예외를 참조한다.
       WHEN user_define_error THEN      -- STEP 3
           DBMS_OUTPUT.PUT_LINE( sqlerrm );

   END; 
  /


SQL> set serveroutput on;
SQL> execute user_exception(10);
ORA-20001: 부서에 사원이 몇명 안되네요..

PL/SQL procedure successfully completed.

 


by 기린기린 [2020.07.08 09:14:42]

멋진 아이디어 정말 감사드립니다!~
다만, 저는 사용자 정의 예외 구문을 트리거에 넣어놓은 상태인데요.
위 방법으로 처리 시
예외 구문에 해당되면 롤백이 되야할 트랜잭션이 커밋이 되고
어플리케이션 단에서 에러발생으로 취급하지 않습니다.(에러메시지를 캐치할 수 없습니다.)

오라클에서 해당 옵션이나 방법이 없다면 
어플리케이션단에서 에러메시지를 "ORA-06512"로 문자열을 자를 수 밖에 없을 것 같습니다.
감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입