[ORACLE] 오라클 함수 Exception 처리 방법 (오라클 try catch exception)

[ORACLE] 오라클 함수 Exception 처리 방법 (오라클 try catch exception)

오라클 함수(Oracle Function)도 자바의 try ~ catch 구문과 같은 처리가 가능할까?

오라클 함수를 실행했을 때 SELECT 한 결과 ROW 가 존재하지 않을 경우,
EXCEPTION 이 발생하고 오라클 함수는 null 을 리턴한다.

예를 들어 다음 함수를 보자.

CREATE OR REPLACE FUNCTION get_something (
    input1  IN  VARCHAR2,
    input2  IN  VARCHAR2
)
RETURN VARCHAR2
IS
    retVal  VARCHAR2 (20);
    temp1  VARCHAR2 (20);
BEGIN
    retVal := ”;
  
    SELECT ‘1’
    INTO temp1
    FROM dual
    WHERE ROWNUM < 1;
 
    retVal := temp1;
   
    IF retVal IS NULL OR retVal = ” THEN
        retVal := ‘default’;
    END IF;
   
    RETURN retVal;
END;

위 함수의 의도는 (마지막 부분을 보면 알겠지만)

결과값이 없을 경우(retVal IS NULL OR retVal = ”) 기본값을 리턴하려고 한다.

하지만, 그 의도대로 동작하지 않으며 함수는 null을 리턴한다.
결과 데이터가 없어서(NO_DATA_FOUND) EXCEPTION 이 발생했기 때문이다.

실제로 SELECT get_something(”, ”) FROM DUAL; 을 실행해보면 null이 나온다.

이러한 NO_DATA_FOUND 익셉션을 회피하기 위해서는, 다음과 같이 BEGIN ~ EXCEPTION ~ END; 구문을 사용하면 된다.

CREATE OR REPLACE FUNCTION get_something (
    input1  IN  VARCHAR2,
    input2  IN  VARCHAR2
)
RETURN VARCHAR2
IS
    retVal  VARCHAR2 (20);
    temp1  VARCHAR2 (20);
BEGIN
    retVal := ”;
  
    BEGIN
        SELECT ‘1’
        INTO temp1
        FROM dual
        WHERE ROWNUM < 1;
       
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
        temp1 := null;
    END;
 
    retVal := temp1;
    IF retVal IS NULL OR retVal = ” THEN
        retVal := ‘default’;
    END IF;
   
    RETURN retVal;
END;

이번에는 SELECT get_something(”, ”) FROM DUAL; 을 실행해보면 리턴값으로 문자열 ‘default’ 가 나온다.

실제 업무에서는 디폴트 값을 돌려주기 보다,

BEGIN ~ EXCEPTION ~ END; 구문을 여러 번 반복해서 원하는 값을 찾을 때까지 SELECT하는 코드를 많이 사용한다.

참고로, NO_DATA_FOUND 뿐 아니라 모든 EXCEPTION 을 커버하기 위해서는, 아래와 같이 WHEN OTHERS THEN 을 사용하면 된다.

    BEGIN
        — 내용
        
    EXCEPTION
    WHEN OTHERS THEN
        — 내용
    END;