SQL Serverデータベースのテーブルに加えられた変更を取得し、Oracleデータベースのそのテーブルのコピーを更新する簡単なサンプルプロジェクトをBizTalkでセットアップしようとしています。
SQL Server側では、可変数のレコードを返すGetItemChanges()という名前のストアドプロシージャがあります。
Oracle側では、GetItemChanges()から返されたすべてのレコードを1回の呼び出しで処理できるように、レコードのテーブルをパラメーターとして受け取るように設計されたUpdate_Item_Region_Table()という名前のストアドプロシージャがあります。これは次のように定義されます。
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プロシージャに渡そうとすると例外が発生します。
*アダプタは、URL「oracledb://dvotst/」のポート「WcfSendPort_OracleDBBinding_HOST_DATA_Procedure_Custom」に送信するメッセージを送信できませんでした。この送信ポートに指定された再試行間隔の後に再送信されます。詳細: "System.InvalidOperationException:'HOST_DATA.TBL_OF_REC'のカスタムタイプマッピングが指定されていないか、無効です。*
したがって、カスタムデータ型TBL_OF_RECに関する情報をTypesDLLに取得していないようです。
これを機能させるためのヒントはありますか?