PL/SQL Function / Procedure 실행 오류 확인 방법

2025. 2. 15. 13:18IT/Oracle

반응형

오라클에서 PL/SQL FUNCTION 또는 PROCEDURE가 실행 중 오류를 발생시키는 경우, 해당 실행 오류를 확인하는 방법은 다음과 같습니다:

1. EXCEPTION 블록 사용 : 오라클 PL/SQL 블록에서 발생하는 실행 오류를 확인하려면 EXCEPTION 블록을 사용하여 오류 메시지를 캡처하고 출력하거나 로그에 기록할 수 있습니다.

DECLARE
    result NUMBER;
BEGIN
    -- 함수 호출
    result := my_function(10);

    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('Result: ' || result);
EXCEPTION
    WHEN OTHERS THEN
        -- 오류 메시지 출력
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

• SQLERRM: 마지막 실행 오류의 메시지를 반환.
• SQLCODE: 오류 번호를 반환.

2. DBMS_OUTPUT.PUT_LINE로 디버깅 : 함수 내부에 디버깅 메시지를 삽입하여 실행 흐름을 확인합니다.

CREATE OR REPLACE FUNCTION my_function(x IN NUMBER) RETURN NUMBER IS
    result NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Function started. Input: ' || x);

    -- 예제 로직
    IF x < 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Input must be non-negative');
    END IF;

    result := x * 2;
    DBMS_OUTPUT.PUT_LINE('Function result: ' || result);

    RETURN result;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error in function: ' || SQLERRM);
        RAISE;
END;
/


이렇게 하면 함수 실행 중 어떤 단계에서 문제가 발생했는지 확인할 수 있습니다.

3. USER_ERRORS 뷰로 컴파일 오류 확인 : 컴파일 오류를 확인하려면 아래 쿼리를 실행합니다:

SELECT * FROM USER_ERRORS WHERE NAME = 'MY_FUNCTION';
  • TEXT: 오류 메시지를 보여줍니다.
  • LINE, POSITION: 오류가 발생한 위치를 제공합니다.

4. EXECUTE IMMEDIATE로 실행 오류 캡처 : 실행 중 오류가 발생한 SQL 문장을 동적으로 실행하면서 오류를 확인할 수 있습니다.

DECLARE
    stmt VARCHAR2(1000);
BEGIN
    stmt := 'BEGIN :result := my_function(-1); END;';
    EXECUTE IMMEDIATE stmt USING OUT :result;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Execution Error: ' || SQLERRM);
END;


5. TRACE 또는 V$DIAG_INFO 활용 : 추적 로그를 확인하여 오류의 상세한 내용을 분석할 수도 있습니다.

-- 추적 설정
ALTER SESSION SET SQL_TRACE = TRUE;

-- 추적 해제
ALTER SESSION SET SQL_TRACE = FALSE;

이후 생성된 트레이스 파일을 분석합니다.


6. SHOW ERRORS 명령 : SQL*Plus 또는 SQL Developer에서 오류를 확인할 때 사용합니다.

SHOW ERRORS FUNCTION my_function;


7. 오류 로그 테이블 사용 : 오류 정보를 데이터베이스 테이블에 저장하여 추적할 수 있습니다.

CREATE TABLE error_log (
    error_time  TIMESTAMP,
    error_code  NUMBER,
    error_msg   VARCHAR2(4000)
);

-- 함수 내에서 로그 기록
EXCEPTION
    WHEN OTHERS THEN
        INSERT INTO error_log (error_time, error_code, error_msg)
        VALUES (SYSTIMESTAMP, SQLCODE, SQLERRM);
        RAISE;
END;


위 방법 중 하나를 사용하여 실행 오류를 확인하고 문제를 해결할 수 있습니다. 디버깅 단계에서는 DBMS_OUTPUT.PUT_LINE을 적극 활용하는 것이 유용합니다.

반응형

'IT > Oracle' 카테고리의 다른 글

MERGE 문을 UPDATE 문으로 변경  (0) 2025.02.18
오라클 Lock  (0) 2025.02.16
정적 SQL(Static SQL)과 동적 SQL(Dynamic SQL) 비교  (0) 2025.02.15
오라클 UNDO 최소화 및 데이터 저장 전략  (0) 2025.02.15
Bulk Insert  (0) 2025.02.15