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 |