CREATE OR REPLACE FUNCTION FN_GET_MACHINE_NO( l_cd IN VARCHAR2 ,m_cd IN VARCHAR2 ,s_cd IN VARCHAR2 ) RETURN VARCHAR IS retval VARCHAR2(14); seqNextVal VARCHAR(7); lCdVal VARCHAR(1); mCdVal VARCHAR(2); sCdVal VARCHAR(3); INPUT_ERR EXCEPTION; OUTPUT_ERR EXCEPTION; BEGIN seqNextVal := 0; lCdVal := TRIM(l_cd); mCdVal := TRIM(m_cd); sCdVal := TRIM(s_cd); BEGIN -- 20100823 LCS 수정 : 소분류가 NULL이면 '99'기본값 설정. IF(sCdVal IS NULL) THEN sCdVal := '99'; END IF; IF( lCdVal IS NULL OR mCdVal IS NULL ) THEN RAISE INPUT_ERR; ELSE SELECT SUBSTR( LPAD(DQ_DQMACHN_INDEX.NEXTVAL , 12, '0') , 6, 7) INTO seqNextVal FROM DUAL ; retval := lCdVal || mCdVal || sCdVal || TO_CHAR(SYSDATE, 'YY') || seqNextVal ; END IF; IF LENGTH(retval) <> 14 THEN RAISE OUTPUT_ERR; END IF; EXCEPTION WHEN INPUT_ERR THEN IF( lCdVal IS NULL ) THEN -- 대분류코드값이 없을 때 Exception 발생 RAISE_APPLICATION_ERROR(-20998,'전달된 파라미터(분류코드)에 문제가 있습니다(대분류 코드값이 없습니다.)'); ELSIF( lCdVal IS NULL OR mCdVal IS NULL ) THEN -- 중분류코드값이 없을 때 Exception 발생 RAISE_APPLICATION_ERROR(-20998,'전달된 파라미터(분류코드)에 문제가 있습니다(중분류 코드값이 없습니다.)'); END IF; WHEN OUTPUT_ERR THEN --DBMS_OUTPUT.PUT_LINE('생성된 기기관리번호('||retval||')는 14자리가 아닙니다.'); RAISE_APPLICATION_ERROR(-20999,'생성된 기기관리번호('||retval||')는 14자리가 아닙니다.'); WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN NULL; END; RETURN retval; END FN_GET_MACHINE_NO;
PL-SQL 작성시 오라클 저장함수 RAISE_APPLICATION_ERROR를 사용하여 사용자 정의 예외를 다룰 수 있다. 우리히가 흔히 보는 'ORA-XXXXX'이런 코드를 작성해서 메시지와 함께 발생시킬 수 있다. 숫자 범위는 -20000부터 -20999의 범위 내에서 가능하다. 위 예제에서 처럼 최상단에 exception을 선언하고 중간에 RAISE를 사용해서 특정 조건에 만족하면 Exception을 발생시키고 하단에 RAISE_APPLLICATION_ERROR(...) 함수를 사용해서 구체적인 에러코드와 메시지를 구성해서 발생시키면 된다. 이렇게 사용하게되면 Application단에서 exception 다루는 방법 그대로 잡아낼 수 있다. ORA-20999 Exception이 발생하게 된다.출처 : http://otamot.com/m/post/98
728x90
반응형
'DB > Oracle' 카테고리의 다른 글
오라클 rollup (0) | 2018.02.15 |
---|---|
오라클 NULL값 정렬 (NULLS FIRST, NULLS LAST) (0) | 2018.02.15 |
oracle 열을 행으로 (, 구분) (0) | 2018.02.15 |
oracle 조인으로 삭제하기 (0) | 2018.02.15 |
Oracle 공휴일, 토요일, 일요일을 제외한 평일 구하기 (0) | 2018.02.15 |