Oracle/PL/SQL2012. 5. 11. 14:07

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 함수를 사용하면 PL/SQL 에러를 쉽게 추적할 수 있다.


예제를 위해 아래와 같이 패키지를 생성하자.

CREATE OR REPLACE PACKAGE pkg1
IS
    PROCEDURE p3 (i_p1 IN VARCHAR2);
END pkg1;
/


패키지 본체는 f1 함수와 p1, p2, p3 프로시저를 포함하고 있다. $$PLSQL_UNIT과 $$PLSQL_LINE은 각각 현재 PL/SQL 오브젝트명과 라인을 출력해주는 함수다. 서브 프로그램이 p3 -> p1-> f1 순서로  수행된다. p2는 에러 발생시 수행된다. 

CREATE OR REPLACE PACKAGE BODY pkg1
IS
    -- f1
    FUNCTION f1 (i_p1 IN VARCHAR2)
        RETURN NUMBER
    IS
    BEGIN
        RETURN TO_NUMBER (i_p1);
    END f1;

    -- p1
    PROCEDURE p1 (i_p1 IN VARCHAR2)
    IS
        l_v1    NUMBER;
    BEGIN
        l_v1 := f1 (i_p1);
        DBMS_OUTPUT.PUT_LINE (l_v1);
    END p1;

    -- p2
    PROCEDURE p2
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE (SQLERRM);
        DBMS_OUTPUT.PUT_LINE (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    END p2;

    -- p3
    PROCEDURE p3 (i_p1 IN VARCHAR2)
    IS
    BEGIN
        p1 (i_p1);
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE ($$PLSQL_UNIT || ': ' || $$PLSQL_LINE);
            p2;
    END p3;
END pkg1;
/

 

p3 프로시저에 'X'를 입력하면 데이터 변환 에러가 발생한다. 32행에서 p1 프로시저, 16행에서 f1 함수가 수행되었고, 마지막 8행에서 형변환 오류가 발생한 것을 추적할 수 있다. PKG1: 35는 EXCEPTION의 위치다.

EXEC pkg1.p3 ('X');

PKG1: 35
ORA-06502: PL/SQL: 수치 또는 값 오류: 문자를 숫자로 변환하는데 오류입니다
ORA-06512: "SCOTT.PKG1",  8행
ORA-06512: "SCOTT.PKG1",  16행
ORA-06512: "SCOTT.PKG1",  32행

PL/SQL 처리가 정상적으로 완료되었습니다.


'Oracle > PL/SQL' 카테고리의 다른 글

DBMS_UTILITY.EXPAND_SQL_TEXT 프로시저  (0) 2014.04.19
REFERENCE CURSOR 예제  (0) 2013.09.01
한글 자소 분리  (0) 2012.06.22
LONG 타입을 VARCHAR2 타입으로 변환  (0) 2012.05.10
EXECUTE IMMEDIATE 예제  (0) 2012.04.30
Posted by 정희락_