メッセージ本体のエレメントへのアクセス

読み取りまたは書き込みのために、メッセージの内容にアクセスしたい場合には、パーサーが入力ビット・ストリームから作成するツリーにあるエレメントの構造および配置を使用します。 ツリーの最上部から下方に向かって、必要なエレメントに達するまで関連する親と子の関係をたどります。

フィールド参照を構成する場合には、使用する名前は、ESQL 規則に準拠した有効な ESQL ID でなければなりません。二重引用符で囲むと、ESQL はそれを ID であると解釈します。 単一引用符で囲むと、ESQL はそれを文字リテラルと解釈します。 次の例に示されているように、すべてのストリング (文字ストリング、バイト・ストリング、またはバイナリー (ビット) ストリング) は引用符で囲む必要があります。 ストリング内に単一引用符または二重引用符を含める場合には、単一引用符または二重引用符をそれぞれ連続して 2 つ含めてください。
重要: フィールド参照構文に関する詳しい説明については、ESQL フィールド参照を参照してください。
ESQL データ・タイプの詳細については、メッセージ・フローの ESQL データ・タイプをご覧ください。

ESQL の作成にある図で示されているメッセージ Invoice を扱うメッセージ・フローを作成したとします。 例えば、エレメント CardType を Compute ノード内から問い合わせたい場合、以下のステートメントを使用します。

IF InputBody.Invoice.Payment.CardType='Visa' THEN
   DO;
     -- more ESQL --
END IF;

Database または Filter ノードで同じ検査をしたい場合 (参照先が単一の入力メッセージの場合)、以下のようにコーディングします。

IF Body.Invoice.Payment.CardType='Visa' THEN
   DO;
     -- more ESQL --
END IF;

Compute ノードの入力 XML メッセージから出力メッセージにエレメントを変更しないでコピーする場合、次の ESQL を使用します。

SET OutputRoot.XML.Invoice.Customer.FirstName = 
               InputBody.Invoice.Customer.FirstName;

入力 XML メッセージから出力メッセージにエレメントをコピーして更新する場合、例えば大文字への変換、または新しい値の計算によって更新する場合には、次のようにコーディングします。

SET OutputRoot.XML.Invoice.Customer.FirstName = 
               UPPER(InputBody.Invoice.Customer.FirstName);  
SET OutputRoot.XML.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;  

STRING エレメントを定数値に設定する場合、次のようにコーディングします。

SET OutputRoot.XML.Invoice.Customer.Title = 'Mr';

また、次のような同等のステートメントも使用できます。

SET OutputRoot.XML.Invoice.Customer.Title VALUE = 'Mr';  

INTEGER または DECIMAL を更新する場合、例えばエレメント TillNumber が値 26 を持つ場合には、次のように代入します (Compute ノードでのみ有効)。

SET OutputRoot.MRM.Invoice.TillNumber=26;  

整数データ・タイプは 64 ビットの 2 の補数形式を使用して数値を保管するため、-9223372036854775808 から 9223372036854775807 の範囲の数値が使用可能です。 16 進数表記の整数および通常の整数リテラル形式を指定できます。 16 進文字 A から F は、大文字でも小文字でも構いません。 必要な場合には 先頭の 0 の後ろの X も同様です。次に示す例も上の例と同じ結果を生成します。

SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;  

次の例は、Invoice メッセージの例には出現しないエレメント・タイプの SET ステートメントを示しています。

FLOAT エレメントを非整数値に設定するには、次のようにコーディングします。

SET OutputRoot.MRM.FloatElement1 = 1.2345e2;

BINARY エレメントを定数値に設定するには、次のようにコーディングします。

SET OutputRoot.MRM.BinaryElement1 = X'F1F1';

BINARY 値の場合、始めの文字 X (大文字または小文字) を使用して、示されているように、16 進文字 (大文字または小文字) を単一引用符で囲む必要があります。

BOOLEAN エレメントを定数値 (値 1 が true に相当し、0 が false に相当する) に設定するには、次のようにコーディングします。

SET OutputRoot.MRM.BooleanElement1 = true;

または

SET OutputRoot.MRM.BooleanElement1 = 1;

SELECT ステートメントを使用すると、レコードを再フォーマットせずに、なおかつ各レコードの完全なフォーマットが分からなくても、入力メッセージからのレコードをフィルター操作できます。次の例をご覧ください。

-- Declare local variable
DECLARE CurrentCustomer CHAR 'Smith';

-- Loop through the input message
SET OutputRoot.XML.Invoice[] =
    (SELECT I FROM InputRoot.XML.Invoice[] AS I
              WHERE I.Customer.LastName = CurrentCustomer
    );

これにより、WHERE 条件 (LastName = Smith) を満たす場合には、入力 Invoice メッセージからのすべてのレコードを出力メッセージに書き込めます。 この条件を満たさないレコードすべては、入力から出力へはコピーされません。 相関名 InputRoot.XML.Invoice[] の別名として I が使用されます。

宣言済みの変数 CurrentCustomer は DECLARE ステートメントで初期化されます。 初期値が分かっている変数を宣言する場合にはこれが最も能率的です。

この別名手法は他の SELECT 構成と共に用いることができます。 例えば、入力 Invoice メッセージのすべてのレコードを選択して、追加のレコードを作成する場合には、次のようにします。

-- Loop through the input message
SET OutputRoot.XML.Invoice[] =
    (SELECT I, 'Customer' || I.Customer.LastName AS ExtraField
              FROM InputRoot.XML.Invoice[] AS I
    );

また AS 文節を組み込んで、メッセージ・ツリーのサブフォルダーにレコードを配置できます。

-- Loop through the input message
SET OutputRoot.XML.Invoice[] =
    (SELECT I AS Order
            FROM InputRoot.XML.Invoice[] AS I
    );

ヌル値を含む、またはヌル値が含まれる可能性のあるエレメントを照会または設定する場合には、次の考慮事項に注意してください。

ヌル値の照会
エレメントを ESQL キーワード NULL と比較すると、パーサーが入力メッセージから作成した論理ツリー内にエレメントが存在するかどうかをテストします。

例えば、次のステートメントを使用して、現行の Invoice メッセージに送り状番号が含まれているかどうかを検査します。

IF InputRoot.XML.Invoice.InvoiceNo IS NULL THEN
   DO;
     -- more ESQL --
END IF;

ESQL 参照も使用することができます。次の例は、これを示しています。

DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo;

IF LASTMOVE(cursor) = FALSE THEN
   SET OutputRoot.MRM.Analysis = 'InvoiceNo does not exist in logical tree';
ELSEIF FIELDVALUE(cursor) IS NULL THEN
   SET OutputRoot.MRM.Analysis =
       'InvoiceNo does exist in logical tree but is defined as an MRM NULL value';
ELSE
   SET OutputRoot.MRM.Analysis = 'InvoiceNo does exist and has a value';
END IF;

参照の宣言および使用に関する詳細については、動的フィールド参照の作成を参照してください。LASTMOVE および FIELDVALUE 関数の説明は、LASTMOVE 関数およびFIELDTYPE 関数を参照してください。

メッセージが MRM ドメインにある場合には、物理形式に依存するヌル値の照会に関する別の考慮事項があります。詳細については、MRM ドメインにおけるメッセージのヌル値の照会を参照してください。

ヌル値の設定
ヌル値を設定するのに使用できる、2 つのステートメントがあります。
  1. 次のステートメントを使ってエレメントを NULL に設定する場合、エレメントはメッセージ・ツリーから削除されます。
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;

    メッセージが MRM ドメインにある場合には、物理形式に依存するヌル値に関する別の考慮事項があります。詳細については、MRM ドメインにおけるメッセージのヌル値の設定を参照してください。

    これは暗黙のヌル処理と呼ばれます。

  2. このエレメントの値を次のように NULL に設定する場合、
    SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;
    エレメントはメッセージ・ツリーから削除されません。 その代わり、NULL の特殊値がエレメントに割り当てられます。
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;

    メッセージが MRM ドメインにある場合には、出力ビット・ストリームの内容は、物理形式ヌル処理プロパティーの設定に依存します。 詳細については、MRM ドメインにおけるメッセージのヌル値の設定を参照してください。

    これは明示的なヌル処理と呼ばれます。

MRM 複合エレメントまたは XML、XMLNS、さらには JMS 親エレメントを VALUE キーワードを使用しないで NULL に設定する場合には、エレメントとその子すべては論理ツリーから削除されます。

関連概念
メッセージ・フローの概要
相関名
メッセージのモデル化
関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
MRM ドメインのメッセージのエレメントへのアクセス
関連資料
Compute ノード
Database ノード
Filter ノード
ESQL 参照
DECLARE ステートメント
IF ステートメント
FIELDVALUE 関数
LASTMOVE 関数
SELECT 関数
SET ステートメント
ESQL フィールド参照
ESQL 予約キーワード
サンプル・メッセージ
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ac06010_