2010-03-11 9 views
0

약 38 개의 입력 매개 변수를 사용하여 vba (Excel)에서 저장 한 프로 시저를 실행해야합니다.
저장 프로 시저가 실행되면 대상 테이블에 일부 값이 삽입됩니다. VBA를 통해 실행될 때 삽입되는 필드의 수는 백 큐트 (oracle)에서 직접 으로 실행될 때보 다 덜 입니다.Excel에서 Oracle 저장 프로 시저 호출 - VBA

예를 들어, 백 엔드에서 직접 을 실행하는 동안 약 17 개의 레코드 필드를 생성합니다. ( 백 슬래시 래퍼 클래스를 만들고 백 엔드에 동일한 매개 변수 값을 전달했습니다.). 에서 실행되는 동안 약 15 개의 필드가 생성되어 대상 테이블의 VBA를 능가합니다.

이 문제의 가능한 원인을 알려주십시오.

+0

데이터베이스 테이블에는 필드가 없습니다. 따라서 "17 개의 레코드 필드를 생성하고 있습니다"라고 말하면 17 개의 행을 삽입하거나 17 개의 채워진 열이있는 레코드 하나를 삽입한다는 의미입니까? – APC

+0

테이블에 17 개의 행을 삽입 중입니다. 백엔드에서는 저장 프로 시저가 매개 변수를 기반으로 다른 테이블을 조작하고이 행에 값을 삽입합니다. 백엔드에서 값은 1000으로 설정되어 수신 된 텍스트를 블록 단위로 구분합니다. – Ram

답변

0

우리 자신의 코드를 디버깅하는 것은 어렵습니다. 다른 사람의 코드를 원격으로 디버깅하는 것은 사실상 불가능합니다. 우리가 할 수있는 일은 코드를 디버깅하는 데 도움이되는 지침을 제공하는 것입니다.

기본적으로 같은 코드는 서로 다른 클라이언트에서 동일한 매개 변수를 사용하여 호출 할 때 두 가지 방식으로 동작합니다. 가장 가능성있는 설명은 VBA 호출이 잘못된 매개 변수 값 (예 : 잘못 명명 된 셀 또는 암시 적 데이터 유형 변환)을 전달하지 않는다는 것입니다. 그러나 알 수있는 유일한 방법은 코드에 일부 추적을 작성하는 것입니다. 이것은 단순히 코드 내부에서 디버그 메시지를 작성하는 것을 의미합니다.

이렇게하는 유감스럽게 일반적인 방법은 DBMS_OUTPUT, 일명 악마의 디버거를 사용하는 것입니다. 이렇게하면 VBA에서 프로 시저를 호출하기 때문에 화면에 씁니다. 따라서 UTL_FILE 또는 LOG_TABLE을 사용하여 파일에 쓸 수 있습니다. 로그 테이블을 사용하는 것은 OS 파일에 기록하는 것보다 더 많은 성능을 발휘할 수 있지만 작업하기가 더 쉽습니다 (최소한 SQL을 사용하는 사람이 sedgrep보다 더 행복한 경우).

거친 추적 구현은 다음과 유사합니다. 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에서 한 번 두 번 실행하십시오. 그런 다음 출력의 두 세트를 비교하십시오. 그들이 다른 곳에서는 대답 할 것입니다.

0

내 생각에 VBA에서 보내는 명령은 SQLPlus 등을 통해 실행할 때 보내는 명령과 다릅니다. 내가하는 것은 Oracle 스토어드 프로 시저 출력을 호출하는 실제 명령을 호출하기 위해 실행중인 VBA 프로 시저를 가지고있는 것입니다. 가 나는 다음과 같은 명령을 전송 한 바보 문제 했어 : StoredProc가 (P1, P2, P3) 하나의 도구 및 StoredProc가에서 (P1, P2, P3, P4) 또 다른 나 StoredProc가에서 (P1을, P3 , p2) 명령을 잘못 작성했기 때문에 (또는 비슷한 이유로). 또한 서로 다른 값을 보낼 수도 있습니다.
아무튼 VBA가 보내는 명령을 '수동으로'실행중인 명령과 비교하면 문제가 표시됩니다. (두 경우 모두 동일한 사용자로 연결 하시겠습니까?)

관련 문제