함수 안에 에러시 어떻게 해야하는지 모르겠습니다. 0 2 2,006

by Vampirejk [PL/SQL] [2013.06.25 17:20:36]


안녕하세요

아래와 같이 함수를 구현하였는데

빨간색으로 표현된 곳의 데이터가 없는 경우에 에러가 납니다

어떻게 처리를 해야하는지 궁금합니다.


 IF P_GUBUN = 1 THEN 

           SELECT 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||LPAD(TO_NUMBER(SUBSTR(R_NUMBERING,8,3))+ 1, 3, '0')
           INTO  V_RNUMBER
           FROM (          
                  SELECT R_NUMBERING,  RANK() OVER(ORDER BY R_NUMBERING DESC) AS NUM 
                  FROM IF_RMS_ERP_TTM              
                 )
           WHERE NUM = 1;
           
           IF V_RNUMBER IS NULL THEN
              V_RNUMBER := 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||'001';
           END IF;
    
           RETURN V_RNUMBER;
by 마농 [2013.06.25 17:30:42]
-- 기존 쿼리에 조건절이 없네요??? 조건절 반드시 필요합니다.
-- 굳이 분석함수 사용할 필요 없어요. 그냥 MAX 하심 됩니다.
-- MAX 하시면 데이터 없어도 Null 이 리턴됩니다
-- NVL 로 처리로 아래 IF 문도 필요 없어요.
SELECT 'R'||TO_CHAR(sysdate, 'yymmdd')
    || LPAD(NVL(SUBSTR(MAX(r_numbering), 8) + 1, 1), 3, '0')
  INTO v_rnumber
  FROM if_rms_erp_ttm
 WHERE r_numbering LIKE 'R'||TO_CHAR(sysdate, 'yymmdd')||'%'
;

by 거부기 [2013.06.25 18:01:04]
윗분의 답으로 처리하심 간단 합니다만, 그냥 참고로 예외처리방법으로..
 IF P_GUBUN = 1 THEN 
  BEGIN
   SELECT 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||LPAD(TO_NUMBER(SUBSTR(R_NUMBERING,8,3))+ 1, 3, '0')
        INTO  V_RNUMBER
       FROM (          
                  SELECT R_NUMBERING,  RANK() OVER(ORDER BY R_NUMBERING DESC) AS NUM 
                  FROM IF_RMS_ERP_TTM              
                 )
        WHERE NUM = 1;

   EXCEPTION WHEN NO_DATA_FOUND THEN
       V_RNUMBER := 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||'001';
   END;
....

BEGIN..EXCEPTION..END 블럭을 잡아도 되고, 함수전체 BEGIN..(요기)END 에
EXCEPTION을 잡으셔도 됩니다. 
글구 "질문이 함수안에서 에러처리시 ..." 이므로 위의 
Exception 블럭에 필요한 When절에 NO_DATA_FOUND외에 오라클에 미리 선언된 예외상수가
있습니다. 물론 귀찮으면 WHEN OTHERS THEN ... 이것으로 SQLCODE, SQLERRM 을 찍거나
리턴하셔도 되구요... 

Table 11-3 PL/SQL Predefined Exceptions

Exception Name Error Code

ACCESS_INTO_NULL

-6530

CASE_NOT_FOUND

-6592

COLLECTION_IS_NULL

-6531

CURSOR_ALREADY_OPEN

-6511

DUP_VAL_ON_INDEX

-1

INVALID_CURSOR

-1001

INVALID_NUMBER

-1722

LOGIN_DENIED

-1017

NO_DATA_FOUND

+100

NO_DATA_NEEDED

-6548

NOT_LOGGED_ON

-1012

PROGRAM_ERROR

-6501

ROWTYPE_MISMATCH

-6504

SELF_IS_NULL

-30625

STORAGE_ERROR

-6500

SUBSCRIPT_BEYOND_COUNT

-6533

SUBSCRIPT_OUTSIDE_LIMIT

-6532

SYS_INVALID_ROWID

-1410

TIMEOUT_ON_RESOURCE

-51

TOO_MANY_ROWS

-1422

VALUE_ERROR

-6502

ZERO_DIVIDE

-1476






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