ノードに対する ESQL の作成

ESQL を作成して、ESQL ファイル内の Compute、Database、または Filter ノードの動作をカスタマイズします。

始める前に

このタスクを完了するには、以下のタスクを完了している必要があります。

ESQL ファイル内で、メッセージ・フロー内のノードに関連付けられたモジュールを作成します。 モジュールは、特定のタイプの 1 つのノード (Compute、Database、または Filter) にのみ関連付けることができます。モジュール内では、提供されたステートメントおよび関数の他にも、関数やプロシージャーを作成、使用することができます。ローカル定数および変数を作成することもできます。

ブローカー・スキーマのレベルで定数、関数、またはプロシージャーを作成した場合、モジュール内でこれらを参照することもできます。多くの異なるモジュールが使用できるレベルでルーチンを定義することができ、開発時間とメンテナンスの努力の節約になります。

ノードに対して ESQL を作成するには、以下のようにします。

  1. 「ブローカー・アプリケーション開発」パースペクティブに切り替えます。
  2. 「ナビゲーター」ビューで、ESQL を作成したいノードを含むメッセージ・フローをダブルクリックします。 エディター・ビューでメッセージ・フローが開きます。
  3. ノード (Compute、Database、または Filter でなければならない) を右クリックし、「ESQL のオープン」をクリックします。 このメッセージ・フローのデフォルト ESQL ファイル、<message_flow_name>.esql がエディター・ビューに開かれます (このファイルが存在しない場合には、作成されます)。

    (すでにデフォルト・ファイルを作成済みである場合、「ESQL のオープン」をクリックすると、このファイルがエディター・ビューで開き、新しいモジュールが作成されて強調表示されます。)

    ESQL ファイルの終わりに、このノードに対するスケルトン・モジュールが作成されます。その正確な内容は、ノードのタイプによって異なります。

    以下のモジュールは、Compute ノードに対して作成されます。

    CREATE COMPUTE MODULE <module_name>
           CREATE FUNCTION Main() RETURNS BOOLEAN
           BEGIN
                  -- CALL CopyMessageHeaders();
                  -- CALL CopyEntireMessage();
                  RETURN TRUE; 
           END;
    
           CREATE PROCEDURE CopyMessageHeaders() BEGIN
                  DECLARE I INTEGER 1;
                  DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
                  WHILE I < J DO
                         SET OutputRoot.*[I] = InputRoot.*[I];
                         SET I = I + 1;
                  END WHILE;
           END;
    
           CREATE PROCEDURE CopyEntireMessage() BEGIN
                  SET OutputRoot = InputRoot;
           END;
    END MODULE;
    前の ESQL をバージョン 2.1 ブローカーにデプロイ可能にするには、以下の例の太字テキストで示すように、InputRoot および OutputRoot モジュール・レベル変数をプロシージャーまたは関数に引き渡す必要があります。
    CREATE COMPUTE MODULE <module_name>
           CREATE FUNCTION Main() RETURNS BOOLEAN
           BEGIN
                  -- CALL CopyMessageHeaders(InputRoot, OutputRoot);
                  -- CALL CopyEntireMessage(InputRoot, OutputRoot);
                  RETURN TRUE; 
           END;
    
           CREATE PROCEDURE CopyMessageHeaders(IN InputRoot REFERENCE, IN
                  OutputRoot REFERENCE) BEGIN
                  DECLARE I INTEGER 1;
                  DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
                  WHILE I < J DO
                   CREATE LASTCHILD OF OutputRoot DOMAIN FIELDNAME (
                  InputRoot.*[I] ); /*create the parser for OutputRoot*/
                         SET OutputRoot.*[I] = InputRoot.*[I];
                         SET I = I + 1;
                  END WHILE;
           END;
    
           CREATE PROCEDURE CopyEntireMessage(IN InputRoot REFERENCE, IN
                  OutputRoot REFERENCE) BEGIN
                  SET OutputRoot = InputRoot;
           END;
    END MODULE;

    モジュール名は、対応するノード・プロパティーに設定した値によって決まります。デフォルトは <message_flow_name>_<node_type> です。 Main 関数には、以下で説明される、Main 関数に続く Compute ノード・モジュール内で宣言される 2 つのプロシージャーの呼び出しが含まれています。これらの呼び出しはコメント化されます。これらの呼び出しによって提供される関数を組み込みたい場合は、これらの行のコメントを外し、Main で作成する ESQL 内の適切なポイントにそれらの呼び出しを配置します。

    CopyMessageHeaders
    このプロシージャーは、入力メッセージ内に含まれるヘッダーをループし、出力メッセージに各ヘッダーをコピーします。

    バージョン 2.1 からマイグレーションする場合、このプロシージャーは、「Compute ノード・プロパティー」ダイアログの「メッセージ・ヘッダーのコピー」ボタンを選択するときに生成されるコードに相当します。

    CopyEntireMessage
    このプロシージャーは、ヘッダーを含む入力メッセージの内容全体を出力メッセージにコピーします。

    バージョン 2.1 からマイグレーションする場合、このプロシージャーは、「Compute ノード・プロパティー」ダイアログの「メッセージ全体のコピー」ボタンを選択するときに生成されるコードに相当します。

    Database ノードに対して ESQL モジュールを作成する場合、次のモジュールが作成されます。

    CREATE DATABASE MODULE <module_name>
           CREATE FUNCTION Main() RETURNS BOOLEAN
           BEGIN
                   RETURN TRUE; 
           END;
    END MODULE;

    Filter ノードの場合、モジュールは、次の最初の行を除いて、Database ノードで作成されたものと同じです。

    CREATE FILTER MODULE <module_name>
  4. ノードの動作をカスタマイズするには、ESQL をこのファイルに追加します。

    初めに、ESQL ステートメントを Main 関数内に、つまり BEGIN ステートメントより後で RETURN TRUE より前に追加する必要があります。DECLARE ステートメントは、Main 関数外のモジュール内に追加することができます。ファイルに新しい行を追加するには、「Enter」を押します。

    有効な ESQL をコーディングできるように、エディターのカーソルの位置に、有効なステートメントおよび関数のリストが表示されます。この支援を呼び出すには、「編集」 > 「内容アシスト」をクリックします。 Ctrl+Space キーの組み合わせが使用できるシステムもあります。 表示されたリストをスクロールして使用したいコードを見つけて強調表示し、Enter キーを押します。適切なコードがモジュールに挿入され、リストが消えます。

    「内容アシスト」は以下の領域で準備されています。

    • 言語構文に基づいた、適用できるキーワード。
    • BEGIN END; のような、対になるコードのブロック。
    • 使用することのできる定義した定数、ID、ラベル、関数、およびプロシージャー。これらが現行のプロジェクトによって参照されていない場合でも、ルーチンを任意のプロジェクトに入れることができる。
    • データベース相関名の後のデータベース・スキーマ名および表名、INSERT、UPDATE、DELETE、および SELECT ステートメント内の表列名、および多くの場合それらのステートメントの WHERE 文節。
    • メッセージ・フィールド参照のエレメント: ランタイム・ドメイン (パーサー) 名、タイプ式の形式、ネーム・スペース ID、ネーム・スペースで修飾されたエレメント名と属性名、および索引式の形式
    • 出力メッセージ・ルートの下の「プロパティー」フォルダー内の内容。
    • DECLARE NAMESPACE ステートメントの、メッセージ・セットのターゲット・ネーム・スペースおよびスキーマ名。

    「内容アシスト」は、ESQL が正しく構文解析される場合にのみ作動します。BEGIN の後に END が欠落しているなどのエラーや、他の判別されないブロック・ステートメントは、パーサー障害の原因となり、「内容アシスト」は提供されません。「内容アシスト」が作動しないステートメントの周りでそれを試し、どこにエラーがあるかを絞ってください。別の方法は、ESQL ファイルを保管することです。ファイルを保管すると、妥当性検査がなされ、構文エラーがすべて「タスク」ビューに書き込まれます。報告されたエラーを参照して、ESQL 構文のエラーを理解し、訂正してください。「内容アシスト」を使用してほとんどのステートメント (ブロック・ステートメントなど) を生成するなら、これらは正しく入力され、エラーが生じる可能性が減少します。

  5. このモジュールでの作業を終了したら、ESQL ファイルを閉じます。閉じる前にファイルを保管してすべての変更を保存し、ESQL を検査します。

ESQL ファイルを直接開き、エディターを使用してそのファイル内にモジュールを作成したい場合は、そうすることもできます。これを行うには、次のようにします。

  1. 「ブローカー・アプリケーション開発」パースペクティブに切り替えます。
  2. モジュールをその中に作成したい ESQL ファイルを選択します。ダブルクリックしてこのファイルをエディター・ビューで開くか、または右クリックしてから、「開く」をクリックします。
  3. エディター・ビューで新しい行にカーソルを置き、「内容アシスト」を使用してこのタイプのノードに対する適切なモジュール・スケルトン (CREATE COMPUTE MODULE END MODULE; など) を選択します。これはユーザー自身で入力することも可能ですが、入力する内容が上に示した必要なスケルトンと整合していることを確認する必要があります。「内容アシスト」を使用すると、必要な場所に有効な ESQL だけが挿入され、マッチする終了ステートメント (END MODULE; など) だけが挿入されてさらに助けが得られるので、これを使用してください。
  4. 適切に、モジュールのコーディングを完了します。

ESQL ファイルを開くのにどちらの方法を使用するにしても、ESQL のコーディングを支援する関数をエディターが提供することをご承知おきください。ここでは「内容アシスト」について触れましたが、エディターで使用できる関数は他にもあります。これらの関数については、ESQL エディターを参照してください。

関連概念
メッセージ・フローの概要
ブローカー・スキーマ
ESQL モジュール
関連タスク
メッセージ・フローの作成
ノードに対する ESQL の変更
ESQL エディター設定の変更
関連資料
組み込みノード
ESQL 参照
ESQL エディター
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ak09033_