Текущее время: Вс, июл 27 2025, 20:48

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: ADBC Вызов хранимой процедуры с табличным параметром
СообщениеДобавлено: Чт, фев 12 2015, 14:20 
Начинающий
Начинающий

Зарегистрирован:
Пт, сен 09 2011, 12:28
Сообщения: 12
Всем доброго дня и хорошего настроения!

Столкнулся на днях со следующей задачей:
Необходимо подключаться к внешней БД MS SQL и запускать там хранимую процедуру.
В хранимку необходимо передать несколько параметров, среди которых есть таблица (как входной параметр).
Если убрать таблицу - процедура вызывается, всё отлично, но стоит добавить таблицу, как получаем ошибку:
"Operand type clash: int is incompatible with ContractNumTableType row 1, col -1"

ContractNumTableType - тип таблицы на внешней базе, структура которой состоит из одного поля типа int

Кто-нибудь сталкивался с подобным?
Буду признателен за любые советы.

Ниже код вызыва хранимки:
Code:
  types: begin of ty_data,
           contract_num type i,
         end of ty_data,
         tt_data type standard table of ty_data with empty key.
  data: con_name       type dbcon_name value 'CONN1',
        l_date_fr      type sy-datum   value '20141223',
        l_date_to      type sy-datum   value '20141224',
        l_return       type i,
        l_rows_proceed type i,
        lt_contr       type tt_data.
  data:   sql_error  type ref to cx_sy_native_sql_error,
          sqlerr_ref type ref to cx_sql_exception.

  field-symbols: <fs> like line of lt_contr.

  append initial line to lt_contr.
  read table lt_contr assigning <fs> index 1.
  <fs>-contract_num = 12345.
  append initial line to lt_contr.
  read table lt_contr assigning <fs> index 2.
  <fs>-contract_num = 54321.

  data connection  type ref to cl_sql_connection.

  try .
      connection = cl_sql_connection=>get_connection( con_name = con_name ).
      data(sql) = new cl_sql_statement( con_ref = connection ).

      sql->set_param_table( ref #( lt_contr ) ).

      sql->set_param( data_ref = ref #( l_date_fr )
                      inout    = cl_sql_statement=>c_param_in ).

      sql->set_param( data_ref = ref #( l_date_to )
                      inout    = cl_sql_statement=>c_param_in ).

      sql->set_param( data_ref = ref #( l_return )
                      inout    = cl_sql_statement=>c_param_out ).

      l_rows_proceed = sql->execute_procedure( 'dbo.UpdateSpecial' ).

      connection->commit( ).

      connection->close( ).

    catch cx_sy_native_sql_error into sql_error.
      e_error = sql_error->get_longtext( ).
      if e_error is initial.
        e_error = sql_error->get_text( ).
      endif.
    catch cx_sql_exception into sqlerr_ref.
      e_error = sqlerr_ref->get_longtext( ).
      if e_error is initial.
        e_error = sqlerr_ref->get_text( ).
      endif.
  endtry.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ADBC Вызов хранимой процедуры с табличным параметром
СообщениеДобавлено: Пт, фев 13 2015, 01:40 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, апр 17 2006, 11:03
Сообщения: 123
Такое бывает, если в БД поле символьное, а не числовое.
Проверьте описание хранимки, не CHAR/VARCHAR/NVARCHAR там задан для номера контракта?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ADBC Вызов хранимой процедуры с табличным параметром
СообщениеДобавлено: Пт, фев 13 2015, 13:51 
Начинающий
Начинающий

Зарегистрирован:
Пт, сен 09 2011, 12:28
Сообщения: 12
В хранимке для номера контракта поставлен INT
Но проблема в том, что ADBC вместо таблицы почему-то параметром передает только одно поле этой таблицы.
Если в хранимке делаем вместо таблицы параметр с типом INT - всё нормально, если возвращаем таблицу с полем типа int, то получаем ошибку.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ADBC Вызов хранимой процедуры с табличным параметром  Тема решена
СообщениеДобавлено: Пн, фев 16 2015, 13:41 
Начинающий
Начинающий

Зарегистрирован:
Пт, сен 09 2011, 12:28
Сообщения: 12
Если будет кому полезно:
Решили сделать не через хранимку, а динамически формировать запрос и обращаться к базе средствами ADBC.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB