ORA-06592: CASE 문을 실행하는 중 CASE를 찾을 수 없음 (ORA-06592: CASE not found while executing CASE statement)

PL/SQL을 활용한 개발 중, ORA-06592: CASE 문을 실행하는 중 CASE를 찾을 수 없음이라는 오류를 마주했다면 CASE 문에서 모든 가능성을 처리하지 않았기 때문일 가능성이 높습니다. 이번 포스팅에서는 이 오류의 원인과 해결 방법을 예제와 함께 살펴봅니다.

ORA-06592 오류 원인

ORA-06592 오류는 CASE 문에서 특정 값에 대해 명시된 조건이 없고, 기본 처리를 위한 ELSE 절이 생략된 경우 발생합니다. CASE 문은 모든 입력값에 대해 반드시 결과를 반환해야 합니다. 만약 입력값이 WHEN 절의 어떤 조건에도 해당하지 않는다면 ELSE 절이 필요합니다. 그렇지 않으면 PL/SQL이 적합한 조건을 찾지 못해 오류를 반환합니다.

ORA-06592 문제가 되는 코드 예제

다음 예제는 SALESMAN이라는 값을 처리하는 조건이 없고, ELSE 절도 생략되어 있습니다. 이로 인해 CASE 문이 해당 입력값에 대해 적절한 결과를 반환하지 못해 오류를 발생시킵니다.

DECLARE
    vSALARY_RATE NUMBER;
    FUNCTION CALCULATE_SALARY_RATE(
        aJOB IN VARCHAR2
    ) RETURN NUMBER IS
        vRATE NUMBER := 0;
    BEGIN
        -- 직업에 따른 급여 비율 설정
        CASE aJOB
            WHEN 'MANAGER' THEN
                vRATE := 1.5;
            WHEN 'CLERK' THEN
                vRATE := 1.0;
            WHEN 'ANALYST' THEN
                vRATE := 1.8;
            -- 'SALESMAN' 등 나머지 값 처리 없음
        END CASE;
        RETURN vRATE;
    END CALCULATE_SALARY_RATE;
BEGIN
    -- 함수 호출
    vSALARY_RATE := CALCULATE_SALARY_RATE('SALESMAN');

    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('Calculated Salary Rate: ' || vSALARY_RATE);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM); -- 에러 메시지 출력
END;
/

--Error: ORA-06592: CASE not found while executing CASE statement

--PL/SQL procedure successfully completed.

실행 결과, 위 코드를 실행하면 다음과 같은 오류 메시지가 출력됩니다

ORA-06592: CASE 문을 실행하는 중 CASE를 찾을 수 없음
PL/SQL: Statement ignored

해결 방법

문제를 해결하려면 CASE 문에 모든 입력값을 처리할 수 있도록 ELSE 절을 추가해야 합니다. ELSE 절을 사용하면 WHEN 조건에 해당하지 않는 모든 경우에 대해 기본 동작을 정의할 수 있습니다.

수정된 코드

아래는 CASE 문에 ELSE 절을 추가하여 문제를 해결한 예제입니다

DECLARE    
    vSALARY_RATE NUMBER;    
    FUNCTION CALCULATE_SALARY_RATE(
        aJOB IN VARCHAR2
    ) RETURN NUMBER IS
        vRATE NUMBER := 0;
    BEGIN
        -- 직업에 따른 급여 비율 설정
        CASE aJOB
            WHEN 'MANAGER' THEN 
                vRATE := 1.5;
            WHEN 'CLERK' THEN
                vRATE := 1.0;
            WHEN 'ANALYST' THEN
                vRATE := 1.8;
            ELSE
                vRATE := 0.8; -- 나머지 값에 대한 기본 처리
        END CASE;       
        RETURN vRATE;
    END CALCULATE_SALARY_RATE;                
BEGIN
    -- 함수 호출
    vSALARY_RATE := CALCULATE_SALARY_RATE('SALESMAN');

    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('Calculated Salary Rate: ' || vSALARY_RATE);
EXCEPTION 
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM); -- 에러 메시지 출력
END;
/

수정된 코드의 실행 결과

수정된 코드를 실행하면 오류 없이 다음과 같은 결과가 출력됩니다

Calculated Salary Rate: 0.8

왜 ELSE 절이 중요한가요?

  • CASE 문은 PL/SQL의 컨트롤 구조 중 하나로, 입력값에 따라 여러 분기 처리를 수행합니다. 하지만 입력값이 WHEN 조건에 해당하지 않을 경우, 실행이 멈추고 오류가 발생합니다.
  • ELSE 절을 추가하면 예상치 못한 입력값이 들어와도 기본값으로 처리하여 코드가 안정적으로 동작합니다.

마무리

ORA-06592 오류는 CASE 문에서 모든 입력값을 처리하지 못한 경우 발생하는 일반적인 문제입니다. 이를 방지하려면 ELSE 절을 추가하거나, 모든 가능한 입력값을 WHEN 조건으로 명시해야 합니다. 😊

IF는 ELSE절이 없더라도 디버깅 환경에 따라 워닝 정도를 표시할 수도 있는데요, 그래도 사용하는 것을 권장하는 편이에요.

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗