6.5 PL/SQL 패키지/함수/프러시저에서 에러발생시 실행한 소스코드, 실행프로그램이름 출력
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=582
n DBMS_UTILITY.FORMAT_ERROR_BACKTRACE : 오류추적을 용이하게 하기 위해 예외가 발생 했을 때의 스택의 내용을 뒤에서부터 보여준다. (에러코드, 실행한 프로시저, 함수, 패키지명, 에러발생 라인번호를 출력)
n DBMS_PREPROCESSOR.GET_POST_PROCESSED_SOURCE : PL/SQL 소스를 배열형태(Table Type)로 리턴한다.
n $$PLSQL_UNIT : 조건 컴파일 지시자로 PL/SQL 프로그램의 이름을 리턴한다.
n 보통 PL/SQL 함수와 프로시저는 서로 호출을 많이 하므로 복잡한 시스템에서는 디버깅이 어려울 수 있으므로 이 경우 사용하면 좋을 것 같다.
create or replace procedure a as begin b(); exception when others then rollback; dbms_output.put_line('>>>>> 중복키 에러.'); --에러코드와 에러메시지 dbms_output.put_line('>>>>> [SQLCODE] ' || SQLCODE); dbms_output.put_line('>>>>> [SQLERRM] ' || SQLERRM); end; /
create or replace procedure b as begin insertemp(7369, '73길동'); end; /
create or replace procedure insertemp (p_empno in emp.empno%type, p_ename emp.ename%type) as
begin insert into emp(empno, ename) values (p_empno, p_ename); commit; end; /
SQL> EXEC a() >>>>> 중복키 에러. >>>>> [SQLCODE] -1 >>>>> [SQLERRM] ORA-00001: 무결성 제약 조건(SCOTT.PK_EMP)에 위배됩니다
PL/SQL 처리가 정상적으로 완료되었습니다.
a 프로시저를 아래처럼 변경해보자.
create or replace procedure a as begin b(); exception when others then rollback; dbms_output.put_line('>>>>> 오류발생');
--에러코드와 에러메시지 dbms_output.put_line('>>>>> [SQLCODE] ' || SQLCODE); dbms_output.put_line('>>>>> [SQLERRM] ' || SQLERRM);
-- 스택의 내용을 출력 dbms_output.put_line(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); end; /
다시실행 SQL> exec a() >>>>> 오류발생 >>>>> [SQLCODE] -1 >>>>> [SQLERRM] ORA-00001: 무결성 제약 조건(SCOTT.PK_EMP)에 위배됩니다 ORA-06512: "SCOTT.INSERTEMP", 6행 ORA-06512: "SCOTT.B", 4행 ORA-06512: "SCOTT.A", 4행
Insertemp 프러시저의 소스코드를 출력하기 위해 아래처럼 변경해보자.
create or replace procedure insertemp (p_empno in emp.empno%type, p_ename emp.ename%type) as v_source_lines dbms_preprocessor.source_lines_t; v_line_num number; begin insert into emp(empno, ename) values (p_empno, p_ename); commit; exception when others then rollback; dbms_output.put_line(SYS.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); v_source_lines := dbms_preprocessor.get_post_processed_source (object_type => 'procedure' ,schema_name => 'scott' ,object_name => $$PLSQL_UNIT); v_line_num := 0; for i in 1..v_source_lines.last loop --지정된 크기의 메시지 버퍼를 할당하고 DBMS_OUTPUT 패키지 내의 --다른 프로시저를 사용할 수 있게 하는 프로시저 dbms_output.enable(100000); dbms_output.put_line('Line number: '||v_line_num || v_source_lines(i)); v_line_num := v_line_num + 1; end loop; end; /
SQL> exec a() ORA-06512: "SCOTT.INSERTEMP", 7행
Line number: 0procedure insertemp Line number: 1 (p_empno in emp.empno%type, p_ename emp.ename%type) Line number: 2 as Line number: 3 v_source_lines dbms_preprocessor.source_lines_t; Line number: 4 v_line_num number; Line number: 5 begin Line number: 6 insert into emp(empno, ename) values (p_empno, p_ename); Line number: 7 commit; Line number: 8 exception ….. |