2010-03-11 121 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发送的命令,并将其与“手动”运行的任何命令进行比较,则应该会看到该问题。 (另外,您是否在两种情况下都以相同用户的身份进行连接?)