メッセージ・マッピングのマイグレーションに関する制約事項

バージョン 5.0 からメッセージ・マップをマイグレーションする方法を取り上げます。

バージョン 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 を呼び出すことに関する、さらに多くの例と情報については、以下のサンプルを参照してください。 サンプルは、Message Brokers Toolkit と統合されているインフォメーション・センターを使用する場合にのみ表示できます。
  1. .mfmap ファイルに ESQL 関数を定義できるかどうかを判別します。
    1. ターゲット値が複合エレメント (ESQL 用語で言えば REFERENCE) である場合、個々のマッピングを .msgmap ファイルで書き直す必要があります。マッピングを .mfmap ファイルから削除し、ステップ 4 に進みます。
    2. 他のすべての場合 (CHAR ストリング、数値、日付、および時刻) には関数を使用します。ステップ 2 に進みます。
  2. 関数のソース・パラメーターと戻りのタイプを判別します。
    1. マッピングのソース・パスごとに、関数またはプロシージャーに 1 つのパラメーターがなければなりません。関数では、パラメーターはすべて変更不能です。パラメーターのタイプは、ソース・データ・タイプと一致している必要があります。
    2. 関数の戻り値の型は、先ほど判別した ESQL データ・タイプです。
  3. .mfmap ファイルを更新してマイグレーションを使用可能にします。マッピング内の関数を起動するよう、.mfmap ファイルを変更します。その際、ステップ 2a でリストされている順序でソース・パラメーターを関数に渡します。
  4. mqsimigratemfmaps コマンドを再実行して、変更された .mfmap ファイルをマイグレーションします。
  5. マイグレーション・ログにエラーが報告されなくなるまで、ステップ 1 から 4 を繰り返します。
  6. バージョン 6.0 Message Brokers Toolkit を開始し、マイグレーションされた .msgmap ファイルを開きます。
    1. 関数としてマイグレーションされた ESQL の場合、エラーはないはずです。
    2. 複合エレメント・ターゲットの場合、バージョン 6.0 の機能を使用してマッピングを書き換えます。
以下の例は、.mfmap ファイルから .msgmap ファイルへのマイグレーションを示しています。
  • 次のような反復するソース式への複数の参照をマイグレーションするとします。
    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 MIN、MAX、および COUNT 関数を使用する式
    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 を呼び出します。

  • 式の中で mfmap インデックス変数を使用する .mfmap ファイル:
    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 で書き換える必要があります。

  • 値を計算するために ROW 式を使用する .mfmap ファイル:
    src_msg.e IN (1, 2, 3)
    .msgmap ファイルは ESQL ROW 式をサポートしていないため、ESQL で書き換える必要があります。

サブマップのマイグレーションに関する制約事項

バージョン 5.0 のメッセージ・マップでは、複雑なエレメント・タイプをサブマップのルートにすることができます。しかし、バージョン 6.0 では、グローバル・エレメントまたはグローバル属性のみサブマップのルートにすることができます。 バージョン 5.0 のメッセージ・マップに、マップ・ルートとして非グローバル・エレメントのあるサブマップに対する呼び出しが含まれる場合、このメッセージ・マップをマイグレーションする際には、このサブマップはスタンドアロン・サブマップとしてマイグレーションされません。代わりに、メイン・メッセージ・マップ内のサブマップに対する呼び出しは、サブマップのマイグレーション後の内容によって置き換えられます。または、サブマップにマップ・ルートとしてグローバル・エレメントがある場合、代わりにサブマップがスタンドアロンのバージョン 6.0 サブマップにマイグレーションされます。

バージョン 6.0の場合、再使用可能なスキーマ構造を、グローバル・エレメントおよびタイプとして定義しなければなりません。ローカル・エレメントを使用するバージョン 5.0 サブマップがある場合、スキーマに変更を加えて、ローカル・エレメント用にグローバル・エレメントの定義を追加してから、マイグレーション後にこの新しいスキーマを使用しなければなりません。新しいグローバル・エレメントの名前とタイプがローカル・エレメントと同じ場合は、バージョン 5.0 サブマップに変更を加える必要はありません。

バージョン 6.0 へのマイグレーションを正常に行うためには、バージョン 5.0 サブマップ中のローカル・エレメントをネーム・スペースで修飾しなければなりません。マイグレーション後にこのエレメントと置き換わるグローバル・エレメントは、ネーム・スペースによって修飾されなければならないからです。サブマップにローカル・エレメントが含まれている場合は、サブマップを再作成し、メイン・メッセージ・マップからのサブマップの呼び出しを再作成しなければなりません。

以下の表は、サブマップ中でサポートされる機能に関する バージョン 5.0バージョン 6.0 の違いを示しています。
バージョン サポートされる機能
バージョン 5.0 マップ・ソースとしてのグローバル・エレメントおよびグローバル属性
マップ・ターゲットとしてのグローバル・エレメントおよびグローバル属性
マップ・ソースとしてのローカル・エレメントおよびローカル属性
マップ・ターゲットとしてのローカル・エレメントおよびローカル属性
バージョン 6.0 マップ・ソースとしてのグローバル・エレメント、グローバル属性、およびグローバル・タイプ
マップ・ターゲットとしてのグローバル・エレメントおよびグローバル属性
関連タスク
ESQL の開発
関連資料
バージョン 5.0 からのメッセージ・マッピングのマイグレーション
mqsimigratemfmaps コマンド
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
最終更新 : 2009-02-20 12:44:31

ar25255_