1

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に取得していないようです。

これを機能させるためのヒントはありますか?

4

1 に答える 1

2

他の誰かがこのタイプのタスクで問題を抱えている場合に備えて、私の問題は、スキーマとバインディング ファイルを生成する前に、すべてのプロパティが正しく設定されていなかったことです。

GeneratedUserTypesAssemblyFilePath <- 私はこれを持っていました…</p>

GeneratedUserTypesAssemblyKeyFilePath <- このセットはありませんでした…残りのプロジェクトで使用したのと同じ厳密な名前のキー ファイルに設定しました。

送信ポートで DLL へのフル パスを提供する必要があったため、GAC に存在する必要はないと考えていましたが、GAC に存在する必要はありません。デプロイ プロセスでは通常のプロジェクト DLL のみが配置されるため、手動で追加する必要があります。 GACに。

Visual Studio コマンド ウィンドウから次のコマンドを実行しました。

gacutil /i [path to the generated user types DLL] /f
于 2011-01-11T21:25:58.873 に答える