우리 자신의 코드를 디버깅하는 것은 어렵습니다. 다른 사람의 코드를 원격으로 디버깅하는 것은 사실상 불가능합니다. 우리가 할 수있는 일은 코드를 디버깅하는 데 도움이되는 지침을 제공하는 것입니다.
기본적으로 같은 코드는 서로 다른 클라이언트에서 동일한 매개 변수를 사용하여 호출 할 때 두 가지 방식으로 동작합니다. 가장 가능성있는 설명은 VBA 호출이 잘못된 매개 변수 값 (예 : 잘못 명명 된 셀 또는 암시 적 데이터 유형 변환)을 전달하지 않는다는 것입니다. 그러나 알 수있는 유일한 방법은 코드에 일부 추적을 작성하는 것입니다. 이것은 단순히 코드 내부에서 디버그 메시지를 작성하는 것을 의미합니다.
이렇게하는 유감스럽게 일반적인 방법은 DBMS_OUTPUT, 일명 악마의 디버거를 사용하는 것입니다. 이렇게하면 VBA에서 프로 시저를 호출하기 때문에 화면에 씁니다. 따라서 UTL_FILE 또는 LOG_TABLE을 사용하여 파일에 쓸 수 있습니다. 로그 테이블을 사용하는 것은 OS 파일에 기록하는 것보다 더 많은 성능을 발휘할 수 있지만 작업하기가 더 쉽습니다 (최소한 SQL을 사용하는 사람이 sed
및 grep
보다 더 행복한 경우).
거친 추적 구현은 다음과 유사합니다. AUTONOMOUS_TRANSACTION을 사용하는 것은 선택 사항이지만 주 프로 시저가 예외를 던진 경우 추적 레코드를 보장합니다. 또한 실시간으로 출력을 모니터링 할 수 있습니다.
create or replace procedure your_proc
(p1 in number
, p2 in varchar2
...
, p38 in date)
is
....
procedure write_log
(p_action in varchar2
, p_add_text in varchar2 := null)
is
pragma autonomous_transaction;
begin
insert into log_table
(id, ts, action, add_text)
values
(log_seqno.nextval, systimestamp, p_action, p_add_text);
commit;
end write_log ;
begin
write_log ('YOUR_PROC::START', user);
write_log ('YOUR_PROC::PARAM', 'P1='||to_char(p1));
write_log ('YOUR_PROC::PARAM', 'P2='||p2);
....
write_log ('YOUR_PROC::PARAM', 'P32='||to_char(p32));
...
-- main body of procedure happens here
...
write_log ('YOUR_PROC::END');
exception
when some_exception then
write_log ('YOUR_PROC::EXCEPTION='||some_exception);
raise;
end your_proc;
뿐만 아니라, 특히 루프와 conditiona을 지적, 프로그램의 흐름에 단계를 기록 할 것 paramters의 값을 기록하는 단계; 스위치 (IF .. ELSE, CASE 등).
프로그램을 VBA에서 한 번, SQL * Plus에서 한 번 두 번 실행하십시오. 그런 다음 출력의 두 세트를 비교하십시오. 그들이 다른 곳에서는 대답 할 것입니다.
출처
2010-03-11 13:18:26
APC
데이터베이스 테이블에는 필드가 없습니다. 따라서 "17 개의 레코드 필드를 생성하고 있습니다"라고 말하면 17 개의 행을 삽입하거나 17 개의 채워진 열이있는 레코드 하나를 삽입한다는 의미입니까? – APC
테이블에 17 개의 행을 삽입 중입니다. 백엔드에서는 저장 프로 시저가 매개 변수를 기반으로 다른 테이블을 조작하고이 행에 값을 삽입합니다. 백엔드에서 값은 1000으로 설정되어 수신 된 텍스트를 블록 단위로 구분합니다. – Ram