読み取りまたは書き込みのために、メッセージの内容にアクセスしたい場合には、パーサーによって入力ビット・ストリームから作成されるツリーにあるエレメントの構造および配置を使用します。
ツリーの最上部から下方に向かって、必要なエレメントに達するまで関連する親と子の関係をたどります。
Database ノードまたは Filter ノードで参照するメッセージは 1 つだけなので、こうした別個の相関名を使用する必要があります。 これらのノードには出力メッセージを作成することはできません。 出力メッセージを作成するには、Compute ノードを使用します。
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.XMLNS.Invoice.Customer.FirstName =
InputBody.Invoice.Customer.FirstName;
入力 XML メッセージから出力メッセージにエレメントをコピーして更新する場合、例えば大文字への変換、または新しい値の計算によって更新する場合には、次のようにコーディングします。
SET OutputRoot.XMLNS.Invoice.Customer.FirstName =
UPPER(InputBody.Invoice.Customer.FirstName);
SET OutputRoot.XMLNS.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;
STRING エレメントを定数値に設定する場合、次のようにコーディングします。
SET OutputRoot.XMLNS.Invoice.Customer.Title = 'Mr';
また、次のような同等のステートメントも使用できます。
SET OutputRoot.XMLNS.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;
次の例は、サンプル・メッセージには出現しないエレメント・タイプの 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.XMLNS.Invoice[] =
(SELECT I FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName = CurrentCustomer
);
このコードにより、WHERE 条件 (LastName = Smith) を満たす場合には、入力メッセージからのすべてのレコードを出力メッセージに書き込めます。 この条件を満たさないレコードすべては、入力メッセージから出力メッセージへはコピーされません。 「I」は、相関名 InputRoot.XMLNS.Invoice[] の別名として使用されます。
宣言済みの変数 CurrentCustomer は DECLARE ステートメントで初期化されます。 初期値が分かっている変数を宣言する場合にはこのオプションが最も能率的です。
この別名手法は他の SELECT 構成と共に用いることができます。 例えば、入力メッセージのすべてのレコードを選択して、追加のレコードを作成する場合には、次のようにします。
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I, 'Customer' || I.Customer.LastName AS ExtraField
FROM InputRoot.XMLNS.Invoice[] AS I
);
また AS 文節を組み込んで、メッセージ・ツリーのサブフォルダーにレコードを配置できます。
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I AS Order
FROM InputRoot.XMLNS.Invoice[] AS I
);
ヌル値を含む、またはヌル値が含まれる可能性のあるエレメントを照会または設定する場合には、次の考慮事項に注意してください。
例えば、次のステートメントを使用して、現行の Invoice メッセージに送り状番号が含まれているかどうかを検査します。
IF InputRoot.XMLNS.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 ドメインにおけるメッセージのヌル値の照会を参照してください。
SET OutputRoot.XMLNS.Invoice.Customer.Title = NULL;
メッセージが MRM ドメインにある場合には、物理形式に依存するヌル値に関する別の考慮事項があります。 詳細については、MRM ドメインにおけるメッセージのヌル値の設定を参照してください。
この手法は暗黙のヌル処理と呼ばれます。
SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = NULL;
SET OutputRoot.XMLNS.Invoice.Customer.Title = NULL;
メッセージが MRM ドメインにある場合には、出力ビット・ストリームの内容は、物理形式ヌル処理プロパティーの設定に依存します。 詳細については、MRM ドメインにおけるメッセージのヌル値の設定を参照してください。
この手法は明示的なヌル処理と呼ばれます。
MRM 複合エレメントまたは XML、XMLNS、さらには JMS 親エレメントを VALUE キーワードを使用しないで NULL に設定する場合には、エレメントとその子すべては論理ツリーから削除されます。