BizTalk - создание схемы из хранимой процедуры Oracle с аргументом табличной переменной

Я пытаюсь создать простой пример проекта в BizTalk, который получает изменения, внесенные в таблицу в базе данных SQL Server, и обновляет копию этой таблицы в базе данных Oracle.

На стороне SQL Server у меня есть хранимая процедура GetItemChanges (), которая возвращает переменное количество записей.

На стороне Oracle у меня есть хранимая процедура с именем Update_Item_Region_Table (), предназначенная для принятия таблицы записей в качестве параметра, чтобы она могла обрабатывать все записи, возвращаемые GetItemChanges () за один вызов. Это определяется так:

create or replace type itemrec is OBJECT (
        UPC                VARCHAR2(15),
        REGION             VARCHAR2(5),
        LONG_DESCRIPTION   VARCHAR2(50),
        POS_DESCRIPTION    VARCHAR2(30),
        POS_DEPT           VARCHAR2(5),
        ITEM_SIZE          VARCHAR2(10),
        ITEM_UOM           VARCHAR2(5),
        BRAND              VARCHAR2(10),
        ITEM_STATUS        VARCHAR2(5),
        TIME_STAMP         VARCHAR2(20),
        COSTEDBYWEIGHT     INTEGER
);

create or replace type tbl_of_rec is table of itemrec;

create or replace PROCEDURE Update_Item_Region_table  ( Item_Data  tbl_of_rec ) 
IS
 errcode integer; 
 errmsg varchar2(4000); 
BEGIN 
   for recIndex in 1 .. Item_Data.COUNT
   loop

   update FL_ITEM_REGION_TEST set
      Region            = Item_Data(recIndex).Region,
      Long_description  = Item_Data(recIndex).Long_description,
      Pos_Description   = Item_Data(recIndex).Pos_description,
      Pos_Dept          = Item_Data(recIndex).Pos_dept,
      Item_Size         = Item_Data(recIndex).Item_Size,
      Item_Uom          = Item_Data(recIndex).Item_Uom,
      Brand             = Item_Data(recIndex).Brand,
      Item_Status       = Item_Data(recIndex).Item_Status,
      Timestamp         = to_date(Item_Data(recIndex).Time_stamp, 'yyyy-mm-dd HH24:mi:ss'),
      CostedByWeight    = Item_Data(recIndex).CostedByWeight
   where
      UPC = Item_Data(recIndex).UPC;

   log_message(Item_Data(recIndex).Region, '', 'Updated item ' || Item_Data(recIndex).UPC || '.');

   end loop;

 EXCEPTION 
 WHEN OTHERS THEN 
 errcode := SQLCODE(); 
 errmsg := SQLERRM(); 
 log_message('CE', '', 'Error in Update_Item_Region_table(): Code [' || errcode || '], Msg [' || errmsg || ']  ...'); 
END;

В моем проекте BizTalk я генерирую схемы и информацию привязки для обеих хранимых процедур. Для процедуры Oracle я указал путь к параметру GeneratedUserTypesAssemblyFilePath для создания библиотеки DLL, содержащей определение типов данных. В порту отправки на сервере я помещаю путь к этой DLL типов в параметре UserAssembliesLoadPath.

Я создал карту для перевода схемы GetItemChanges () в схему Update_Item_Region_Table ().

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

* Адаптеру не удалось передать сообщение для отправки на порт "WcfSendPort_OracleDBBinding_HOST_DATA_Procedure_Custom" с URL-адресом "oracledb: // dvotst /". Он будет передан повторно после интервала повтора, указанного для этого порта отправки. Подробности: «System.InvalidOperationException: сопоставление настраиваемого типа для 'HOST_DATA.TBL_OF_REC' не указано или является недопустимым. *

Таким образом, он, по-видимому, не получает информацию о пользовательском типе данных TBL_OF_REC в DLL типов.

Какие-нибудь советы о том, как заставить это работать?


person Ron Savage    schedule 10.01.2011    source источник


Ответы (1)


Если у кого-то еще возникнут проблемы с этим типом задач, моя проблема заключалась в неправильной настройке всех свойств перед созданием схемы и файлов привязки.

GeneratedUserTypesAssemblyFilePath ‹- у меня был этот…

GeneratedUserTypesAssemblyKeyFilePath ‹- у меня не было этого набора… Я установил его на тот же ключевой файл со строгим именем, который я использовал для остальных проектов.

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

Я только что запустил эту команду из командного окна Visual Studio:

gacutil /i [path to the generated user types DLL] /f
person Ron Savage    schedule 11.01.2011
comment
Было бы полезно отметить это как правильный ответ. - person Pieter Vandenheede; 15.03.2016