2010-03-11 7 views
0

Мне нужно выполнить Oracle, сохраненную процедуру , из vba (Excel) с примерно 38 входными параметрами. Запомненная процедура
будет вставлять некоторые значения в таблицу назначения после ее выполнения. Когда он выполняется через VBA, число вставленных полей меньше , чем когда оно выполняется непосредственно с бэкэнда (оракула).Вызов хранимой процедуры oracle из Excel - VBA

Например, он создает около 17 полей записей при выполнении непосредственно с заднего конца. (У меня есть , созданный класс обертки в back-end и передающий те же значения параметров во внутреннем интерфейсе.). Он создает около 15 полей записей при выполнении от excel VBA в таблице адресатов.

Просьба сообщить мне, какие могут быть возможные причины для этого.

+0

Таблицы базы данных не имеют полей. Поэтому, когда вы говорите «он создает около 17 полей записей», вы имеете в виду, что он вставляет 17 строк или вставляет одну запись с 17 заполненными столбцами? – APC

+0

Вставляет 17 строк в таблицу. В Backend хранимая процедура выполняет некоторые манипуляции с другими таблицами на основе передаваемых параметров и вставляет значения в эти строки. В бэкэнд значение установлено как 1000, чтобы разбить полученный текст как блок за блоком. – Ram

ответ

0

Отладка собственного кода достаточно сложна, отладка чужого кода удаленно практически невозможна. Что мы можем сделать, это предоставить вам несколько советов, которые помогут вам отладить ваш код.

В принципе, один и тот же код ведет себя по-разному, когда вызывается от разных клиентов с теми же параметрами. Наиболее вероятным объяснением является то, что вызов VBA не передает значения параметров, которые, по вашему мнению, есть - возможно, есть неназванная ячейка или неявное преобразование типа данных, но единственный способ узнать - построить некоторую трассировку в вашем коде. Это означает просто писать сообщения отладки из внутреннего кода.

К сожалению, общий способ сделать это - использовать DBMS_OUTPUT, AKA Отладчик дьявола. Это записывается на экран, который определяет его для вашего сценария, потому что вы хотите вызвать процедуру из VBA. Таким образом, вы можете либо записать в файл, используя UTL_FILE, либо LOG_TABLE. Использование таблицы журналов, вероятно, скорее поражает производительность, чем запись в файл ОС, но с ней легче работать (по крайней мере, если вы счастливее с SQL, чем sed и grep).

Грубая реализация реализации 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;  

, а также записывать значения paramters вы хотите записать этапы выполнения программы, особенно отметив петлю и conditiona; переключатель (IF .. ELSE, CASE и т. д.).

Запустите программу дважды, один раз из VBA, один раз из SQL * Plus. Затем сравните два набора выходных данных. Там, где они отличаются, вы ответите.

0

Моя лучшая догадка заключается в том, что команда, которую вы отправляете из VBA, отличается от того, что вы отправляете при запуске через SQLPlus или что-то еще. Что бы я сделал, так это то, что вы выполняете всю процедуру VBA, чтобы вызвать Oracle Stored Procedure, выводящую фактическую команду, которую он отправляет. У меня были глупые вопросы, где я отправлял команду типа: storedproc (p1, p2, p3) от одного инструмента и storedproc (p1, p2, p3, p4) от другого или storedproc (p1, p3 , p2) , потому что я неправильно строил свою команду (или аналогичные причины). Вы также можете отправлять разные значения.
Во всяком случае, если вы можете взять команду VBA, она отправляет и сравнивает ее с любой командой, которую вы запускаете «вручную», вы должны увидеть эту проблему. (также, вы подключаетесь как к одному и тому же пользователю в обоих случаях?)

Смежные вопросы