2010-03-11 350 views
0

我必須執行一個Oracle存儲的 過程從vba(Excel)大約38個輸入參數。存儲過程
一旦執行,將在目標表中插入一些 值。當它通過VBA執行時,插入的字段數比從後端(oracle)直接執行 時少了 。從Excel調用oracle存儲過程 - VBA

例如,它在直接從後端執行 時創建大約17個字段的記錄。 (我有 在 後端創建了一個包裝類,並在後端傳遞了相同的 參數值。)。它在 記錄中創建大約15個字段,並在目標表中執行excel VBA中的 。

請讓我知道這可能是什麼原因。

+0

數據庫表中沒有字段。所以當你說「它創建了大約17個記錄的字段」時,你的意思是插入了17行還是插入了一個包含17個填充列的記錄? – APC 2010-03-11 06:23:22

+0

它在表格中插入17行。在後端,存儲過程根據傳遞參數對其他表進行一些操作,並在這些行中插入值。在後端,該值已被設置爲1000,以逐塊拆分接收到的文本。 – Ram 2010-03-11 06:30:25

回答

0

調試我們自己的代碼非常困難,遠程調試別人的代碼幾乎是不可能的。我們可以做的是爲您提供一些指導,幫助您調試代碼。

基本上,當從具有相同參數的不同客戶端調用相同的代碼時,其行爲有兩種不同的方式。最可能的解釋是,VBA調用沒有傳遞您認爲它的參數值 - 可能是錯誤的單元格或隱式數據類型轉換 - 但要知道的唯一方法是在您的代碼中構建一些跟蹤。這意味着只需從代碼內部編寫調試消息。

這樣做的令人遺憾的常見方式是使用DBMS_OUTPUT,AKA The Devil's Debugger。這會寫入屏幕,因爲您想從VBA調用該過程,屏幕會將其排除在外。所以你可以使用UTL_FILE或LOG_TABLE寫入文件。使用日誌表可能比寫入操作系統文件的性能更高,但使用起來更容易(至少如果您對SQL比使用sedgrep更快樂)則更容易。

一個粗略的跟蹤實現woudl看起來像這樣。使用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;  

除了記錄參數的值,您還需要在程序流程中記錄階段,特別是注意循環和條件;開關(IF .. ELSE,CASE等)。

從VBA運行程序兩次,一次從SQL * Plus運行一次。然後比較兩組輸出。如果它們不同,那將是你的答案。

0

我最好的猜測是,您從VBA發送的命令與您在通過SQLPlus或其他方式運行時發送的任何命令都不同。 我所要做的就是使用任何VBA過程來調用Oracle存儲過程輸出它發送的實際命令。 我有我在那裏發送命令一樣傻問題: storedproc(P1,P2,P3) 從一個工具和 storedproc(P1,P2,P3,P4),從另一個或 storedproc (P1,P3 ,p2) ,因爲我錯誤地構建了我的命令(或類似的原因)。 您也可能完全發送不同的值。
無論如何,如果您可以接受VBA發送的命令,並將其與「手動」運行的任何命令進行比較,則應該會看到該問題。 (另外,您是否在兩種情況下都以相同用戶的身份進行連接?)