레이블이 PLSQL에러인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PLSQL에러인 게시물을 표시합니다. 모든 게시물 표시

2020년 7월 19일 일요일

PL/SQL 패키지/함수/프러시저에서 에러발생시 실행한 소스코드, 실행프로그램이름 출력

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

…..

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...