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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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