Старое приложение VB6 с использованием ошибки ADODB при вызове хранимой процедуры Oracle - PullRequest
4 голосов
/ 22 марта 2011

Это должно быть как-то связано с провайдером, потому что он отлично работает на моем устройстве dev, но не работает на другом устройстве dev.

Вот ошибка, которую я получаю на нерабочем устройстве dev:

ORA-00604: ошибка произошла на уровне рекурсивного SQL 1

ORA-06502: PL / SQL: ошибка с числовым значением или значением: буфер символьной строки слишком мал

ORA-06512: в строке 26

ORA-06550: строка 1, столбец 7:

PLS-00306: неверный номер или типы аргументов при вызове 'LISTAVAILSUBMISSIONS'

ORA-06550: строка 1, столбец 7:

PL / SQL: оператор игнорируется

Вот процедура Oracle:

    Procedure ListAvailSubmissions (avail_submission in out rc_avail_submission)
is
Begin
     open avail_submission for
          select submission_id from nais_submissions
          where condition = 'ONLINE'
          and status in ('ACTIVE','LOGGED')
          order by submission_id desc;
Exception
    When no_data_found then
         v_output := utl_file.fopen (v_errdir, v_errLog, 'a');
         utl_file.put_line(v_output, to_char(sysdate,'HH24:MI:SS')||'-'||'ListAvailSubmission:Sub_id: No Data Found');
         utl_file.fclose(v_output);

    When others then
         v_error_code := sqlcode;
         v_error_message := substr (sqlerrm, 1, 300);
         v_output := utl_file.fopen (v_errdir, v_errLog, 'a');
         utl_file.put_line(v_output, to_char(sysdate,'HH24:MI:SS')||'-'||'ListAvailSubmission:Sub_id:'|| v_error_code ||':'|| v_error_message);
         utl_file.fclose(v_output);

End ListAvailSubmissions;

Как видите, единственным параметром является возвращаемый параметр, который является результирующим набором записей

Звонок из VB довольно прост.

Public Function GetTestRequests() As ADODB.Recordset
          Dim rsADO As New ADODB.Recordset
          Dim cmdCommand As New ADODB.Command

          Set cmdCommand.ActiveConnection = cnnADO //Ive already verified the connection is good
          cmdCommand.CommandText = "ListAvailSubmissions"
          Set rsADO = cmdCommand.Execute(, , adCmdStoredProc)
          Set GetTestRequests = rsADO

End Function

Огорчает то, что он работает на одной машине, а не на другой. Я использую msdaora.1 в качестве провайдера и проверил, что обе машины имеют одинаковую версию MDAC, используя инструмент MS CompChecker. Я обнаружил одну вещь: если я переключу рабочую машину на использование OraOLEDB вместо msdaora.1, она выдаст ту же ошибку. Исходя из этого, я начинаю думать, что нерабочий компьютер демонстрирует правильное поведение и что мне нужно исправить код.

Я провел немало исследований и думаю, что это связано с параметром in out и пытаюсь установить ADODB.Recordset равным этому параметру. Я попытался изменить параметр только на out, но это не помогло, но все еще получала ту же ошибку.

Любая помощь приветствуется, эта ошибка сводит меня с ума.

1 Ответ

1 голос
/ 22 марта 2011

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

Проверьте, длинна ли какая-либо строка в вашем наборе результатов, скажем, 256 символов или что-то действительно длинное. Затем пропустите эту запись из набора результатов, чтобы проверить, работает ли она.

...