.mfmap ファイルのマイグレーションがサポートされないシナリオがいくつかあります。このトピックでは、こうした状況でマイグレーションが自動で行われない理由について説明し、マイグレーションを支障なく完了させる方法の説明をしています。
バージョン 5.0 (ファイル・フォーマットは .mfmap) と バージョン 6.0 (ファイル・フォーマットは .msgmap) の間では、メッセージ・マップのプログラミング・モデルが 異なっています。バージョン 5.0 メッセージ・マップは、プロシージャー型プログラミング・モデルに従います。これは要するに代替 ESQL であり、変換を実行するために必要なステップをすべて記述しなければなりません。バージョン 6.0 は、宣言型プログラミング・モデルを使用します。この場合、記述するのは変換の結果であり、その結果を実現する方法はツールが決定します。
ほとんどの場合、マイグレーションの失敗の原因は、メッセージ・マップに入っている、変換の実行ステップに関する情報が多すぎるのに対して、希望する結果についての情報が十分でない、ということにあります。このようなメッセージ・マップでは、.mfmap ファイルを変更して特定の「方法」のセクションを切り離し、メッセージ・マップから呼び出し可能な ESQL 関数またはプロシージャーにする、という方法でマイグレーションを使用可能にできます。.mfmap ファイルは、ESQL を式として収容する代わりに、それを呼び出します。その後、mqsimigratemfmaps コマンドで .mfmap ファイルをマイグレーションしますが、このコマンドはマイグレーション・エラーをログに記録する代わりに ESQL を呼び出します。
1 つの制限として、 ESQL (.mfmap および .msgmap ファイルのランタイム) は複合エレメント (または REFERENCE) の値を戻す関数を定義できないと いうものがあります。以下の手順では、この複合エレメント・ターゲットの制限を回避する方法を説明しています。多くの場合、マップを ESQL として書き換える必要があります。マップから ESQL を呼び出すための詳しい実例および情報については、WebSphere Message Brokers マッピング・サンプルを参照してください。
にあるsrc_msg.e[1] + src_msg.e[2]次のように、ESQL 関数の結果を計算します。
CREATE FUNCTION addOneAndTwo(IN src_msg) BEGIN RETURN src_msg.e[1] + src_msg.e[2]; END;.msgmap ファイルで、親エレメント src_msg をパラメーターとして使用して ESQL 関数 addOneAndTwo を呼び出します。
src_msg.*または
src_msg.*[]は、以下のように、反復フィールドの親を取る関数を使用して処理できます。
CREATE FUNCTION processAny(IN src_msg) BEGIN DECLARE nodeRef REFERENCE TO src_msg.e.*; DECLARE result <dataType> <initialValue>; WHILE LASTMOVE nodeRef DO --expression goes here SET result = result; END WHILE; RETURN RESULT; END;.msgmap ファイルで、親エレメント src_msg をパラメーターとして使用して ESQL 関数を呼び出します。
src_msg.{'a' || 'b'}は、以下のように、反復フィールドの親を処理する ESQL 関数により処理できます。
CREATE FUNCTION processDynamicName(IN src_msg) BEGIN RETURN src_msg.{'a' || 'b'}; END;.msgmap ファイルで、親エレメント src_msg をパラメーターとして使用して ESQL 関数を呼び出します。
SELECT MAX("#T".FIRSTNAME) FROM Database.CUSTOMER AS "#T" WHERE "#T".CUSTOMERID = custIdは、以下のように、反復フィールドの親を処理する ESQL 関数により処理できます。
CREATE FUNCTION processMAX(IN custId) BEGIN RETURN SELECT MAX("#T".FIRSTNAME) FROM Database.CUSTOMER AS "#T" WHERE "#T".CUSTOMERID = custId END;.msgmap ファイルで、エレメント custId をパラメーターとして使用して ESQL 関数を呼び出します。
e || "#I"で mfmap インデックス変数を使用する .mfmap ファイルは、ESQL で完全に書き換える必要があります。 定義によれば複合反復親エレメントがなければならず、これは ESQL 関数によりサポートされません。
src_msg.e[src_msg.a]は、以下のように if 行、msgmap:occurrence() 関数、および ESQL 関数を使用して書き換える必要があります。
for src_msg.e if condition msgmap:occurrence(src_msg/e) = src_msg/a
src_msg.e["#I" +5] src_msg.e[< 3]の場合、.msgmap ファイルは反復フィールドへの索引アクセスをまだサポートしていないため、.mfmap ファイル全体を ESQL で書き換える必要があります。
src_msg.e IN (1, 2, 3)を使用する場合、.msgmap ファイルは ESQL ROW 式をサポートしていないため、ESQL で書き換える必要があります。