バージョン 5.0 からメッセージ・マップをマイグレーションする方法を取り上げます。
バージョン 5.0 (ファイル・フォーマットは .mfmap) と バージョン 6.0 (ファイル・フォーマットは .msgmap) の間では、メッセージ・マップのプログラミング・モデルが 異なっています。バージョン 5.0 メッセージ・マップは、プロシージャー型プログラミング・モデルに従います。これは要するに代替 ESQL であり、変換を実行するために必要なステップをすべて記述しなければなりません。バージョン 6.0 は、宣言型プログラミング・モデルを使用します。この場合、記述するのは変換の結果であり、その結果を実現する方法はツールが決定します。
ほとんどの場合、マイグレーションの失敗の原因は、メッセージ・マップに入っている、変換の実行ステップに関する情報が多すぎるのに対して、希望する結果についての情報が十分でない、ということにあります。このようなメッセージ・マップでは、.mfmap ファイルを変更して特定の「方法」のセクションを切り離し、メッセージ・マップから呼び出し可能な ESQL 関数またはプロシージャーにする、という方法でマイグレーションを使用可能にできます。.mfmap ファイルは、ESQL を式として収容する代わりに、それを呼び出します。その後、mqsimigratemfmaps コマンドで .mfmap ファイルをマイグレーションしますが、このコマンドはマイグレーション・エラーをログに記録する代わりに ESQL 関数を呼び出します。
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 --式がここに入る SET result = result; END WHILE; RETURN RESULT; END;.msgmap ファイルで、親エレメント src_msg をパラメーターとして使用して ESQL 関数 processAny を呼び出します。
src_msg.{'a' || 'b'}は、以下のように、反復フィールドの親を処理する ESQL 関数により処理できます。
CREATE FUNCTION processDynamicName(IN src_msg) BEGIN RETURN src_msg.{'a' || 'b'}; END;.msgmap ファイルで、親エレメント src_msg をパラメーターとして使用して ESQL 関数 processDynamicName を呼び出します。
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 関数 processMAX を呼び出します。
e || "#I"これは、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 ファイルは反復フィールドへの索引アクセスを サポートしていないため、.msgmap ファイル全体を ESQL で書き換える必要があります。
src_msg.e IN (1, 2, 3).msgmap ファイルは ESQL ROW 式をサポートしていないため、ESQL で書き換える必要があります。
バージョン 6.0の場合、再使用可能なスキーマ構造を、グローバル・エレメントおよびタイプとして定義しなければなりません。ローカル・エレメントを使用するバージョン 5.0 サブマップがある場合、スキーマに変更を加えて、ローカル・エレメント用にグローバル・エレメントの定義を追加してから、マイグレーション後にこの新しいスキーマを使用しなければなりません。新しいグローバル・エレメントの名前とタイプがローカル・エレメントと同じ場合は、バージョン 5.0 サブマップに変更を加える必要はありません。
バージョン 6.0 へのマイグレーションを正常に行うためには、バージョン 5.0 サブマップ中のローカル・エレメントをネーム・スペースで修飾しなければなりません。マイグレーション後にこのエレメントと置き換わるグローバル・エレメントは、ネーム・スペースによって修飾されなければならないからです。サブマップにローカル・エレメントが含まれている場合は、サブマップを再作成し、メイン・メッセージ・マップからのサブマップの呼び出しを再作成しなければなりません。
バージョン | サポートされる機能 |
---|---|
バージョン 5.0 | マップ・ソースとしてのグローバル・エレメントおよびグローバル属性 |
マップ・ターゲットとしてのグローバル・エレメントおよびグローバル属性 | |
マップ・ソースとしてのローカル・エレメントおよびローカル属性 | |
マップ・ターゲットとしてのローカル・エレメントおよびローカル属性 | |
バージョン 6.0 | マップ・ソースとしてのグローバル・エレメント、グローバル属性、およびグローバル・タイプ |
マップ・ターゲットとしてのグローバル・エレメントおよびグローバル属性 |