Отладка собственного кода достаточно сложна, отладка чужого кода удаленно практически невозможна. Что мы можем сделать, это предоставить вам несколько советов, которые помогут вам отладить ваш код.
В принципе, один и тот же код ведет себя по-разному, когда вызывается от разных клиентов с теми же параметрами. Наиболее вероятным объяснением является то, что вызов 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. Затем сравните два набора выходных данных. Там, где они отличаются, вы ответите.
Таблицы базы данных не имеют полей. Поэтому, когда вы говорите «он создает около 17 полей записей», вы имеете в виду, что он вставляет 17 строк или вставляет одну запись с 17 заполненными столбцами? – APC
Вставляет 17 строк в таблицу. В Backend хранимая процедура выполняет некоторые манипуляции с другими таблицами на основе передаваемых параметров и вставляет значения в эти строки. В бэкэнд значение установлено как 1000, чтобы разбить полученный текст как блок за блоком. – Ram