メッセージ本体エレメントへのパスを形成するために ESQL フィールド参照を使用できます。
>>-CorrelationName--+---------------------+-------------------->< | .-.---------------. | | V | | '---| PathElement |-+-' PathElement |--+------------+-----------------------------------------------> '-(--Type--)-' >-- ---+----------------------------------+--+-Name-----------------+--> '-+---------------------------+--:-' +-{--NameExpression--}-+ +-Namespace-----------------+ '-*--------------------' +-{--NamespaceExpression--}-+ '---*-----------------------' >--+------------------------+-----------------------------------| '-[--+--------------+--]-' +-Index--------+ +-<--+-------+-+ | '-Index-' | +->--+-------+-+ | '-Index-' | '-<------------'
フィールド参照は、相関名、およびその後に続くピリオド (.) で区切られたパス・エレメント (なくてもよい) から成っています。相関名は既知の開始点を示すので、定数、宣言済みの変数 (スカラー、行、または参照)、または事前定義済みの開始点の 1 つ (InputRoot など) の名前でなければなりません。パス・フィールドは、開始点から希望のフィールドまでのパスを定義します。
InputRoot.XMLNS.Data.Invoice
ブローカーは InputRoot というロケーション (つまり、Compute ノードへの入力メッセージのルート) から開始し、ナビゲーションのシーケンスを実行します。まず最初に、それはルートから最初の子フィールド「XMLNS」までナビゲートし、その後「XMLNS」フィールドの最初の子フィールド「Data」までナビゲートします。最後に、ブローカーは「Data」フィールドの最初の子フィールド「Invoice」までナビゲートします。ESQL プログラム内でこのフィールド参照が生じた場合は常に、
送り状 (invoice) フィールドにアクセスします。InputRoot.XMLNS."Customer Data".Invoice
引用符を含むフィールドを参照する必要がある場合は、参照の前後に 2 組の引用符を使用します。以下に例を示します。 Body.Message."""hello"""
キーワードとして予約済みの ID もありますが、相関名は例外で、二重引用符を使用せずにフィールド参照を使用できます。
InputRoot.XMLNS."Customer Data".{'Customer-' ||
CurrentCustomer}.Invoice
この例では、文字リテラル Customer- を CurrentCustomer (この例では、これはタイプ文字の宣言済み変数でなければならない) 内の値と連結することによって形成される名前を持つフォルダーに、送り状が含まれています。 InputRoot.XMLNS.*.Invoice.Value
送り状が含まれているすべてのパス・エレメントが一致項目になります。ESQL では、二重引用符で囲めば ID となることに注意してください。また、単一引用符で囲めば、文字リテラルとなります。 すべての文字ストリングを単一引用符で囲む必要があります。
DECLARE sp1 NAMESPACE 'http://www.ibm.com/space1';
/* Namespace declaration to associate prefix 'space1' with the namespace */
SET OutputRoot.XMLNS.TestCase.(XML.NamespaceDecl)xmlns:space1 = 'http://www.ibm.com/space1';
SET OutputRoot.XMLNS.TestCase.sp1:data1 = 'Hello!';
以下が生成されます。<TestCase xmlns:space1="http://www.ibm.com/space1">
<space1:data1>Hello!</space1:data1>
</TestCase>
InputRoot.XMLNS.Data[1].Invoice
InputRoot.XMLNS.Data.Invoice[1]
この構成は、索引変数で最も一般的に使用されるもので、ループは該当するすべてのフィールドを順番に処理します。 以下に例を示します。 WHILE count < 32 DO
SET TOTAL = TOTAL + InputRoot.XMLNS.Data.Invoice[count].Amount;
SET COUNT = COUNT + 1
END WHILE;
この種の構成を使用するときには注意が必要です。なぜなら、ループを回すたびに、ブローカーは最初からフィールドをカウントしなければならないことを意味するからです。 繰り返し数える負荷が大きければ、パフォーマンスが低下します。 そのような場合には、代わりにフィールド参照変数を使用したほうがよいでしょう。InputRoot.XMLNS.Data.Invoice -- Selects the first
InputRoot.XMLNS.Data.Invoice[1] -- Selects the first
InputRoot.XMLNS.Data.Invoice[>] -- Selects the first
InputRoot.XMLNS.Data.Invoice[>1] -- Selects the first
InputRoot.XMLNS.Data.Invoice[>2] -- Selects the second
InputRoot.XMLNS.Data.Invoice[<] -- Selects the fourth
InputRoot.XMLNS.Data.Invoice[<1] -- Selects the fourth
InputRoot.XMLNS.Data.Invoice[<2] -- Selects the third
InputRoot.XMLNS.Data.Invoice[<3] -- Selects the second
索引文節はまた、中が空の大括弧 ( [ ] ) にすることもできます。
名前が一致するすべてのフィールドを選択します。 この構成は、リストを予期する関数やステートメント (例えば SELECT、CARDINALITY、SINGULAR、および EXISTS 関数や SET ステートメント) と共に使用してください。フィールド参照のそれぞれのフィールドには、タイプ文節を含めることができます。 タイプ文節は、小括弧 ( ( ) ) によって示され、ヌル以外のタイプ整数を戻す式を入れることができます。 タイプ式がある場合には、選択されるフィールドは、タイプが一致するものだけに制限されます。 この構成は、最も一般的には汎用 XML とともに使用されます。汎用 XML では、多数のフィールド・タイプがあり、1 つの XML フィールドが、属性および同じ名前のさらに別の XML フィールドの両方を含むこともあります。
<Item Value = '1234'>
<Value>5678</Value>
</Item>
この例では、XML フィールド Item には、どちらも『Value』という 2 つの子フィールドがあります。 子フィールドはタイプ文節を使うことによって区別できます。属性を選択するには Item.(<Domain>.Attribute)Value を使用し、フィールドを選択するには Item.(XML.Element)Value を使用します (<Domain> は XML、XMLNS、または XMLNSC のいずれかで、ソースのメッセージ・ドメインによって判別される)。
(1) >>-(--FieldReference--)--ScalarDataTypeName--------------------><
通常はタイプ制約によって、(FIELDVALUE 関数と同様の方法で) 参照のスカラー値が抽出され、参照のタイプが正しくない場合は例外がスローされます。 定義によると、存在しないフィールドはすべて NULL に評価されるので、例外がスローされます。 これは、メッセージに重要なフィールドが欠落している場合に例外をスローするのに便利で早い方法です。
しかし、データベースに渡す候補の式でタイプ制約が生じた場合 (式が WHERE 文節中にある場合など) は、その情報を使用して、式をデータベースに渡せるかどうかが判別されます。 このことは、データベース表の列に対して操作を行う CAST が WHERE 文節に含まれている場合に重要になることがあります。 タイプ制約がない場合、この種の式をデータベースに渡せません。なぜなら、データベースが必要な変換を実行できるかどうかブローカーが識別できないからです。 しかし、データ変換機能が非常に限定されているデータベースもあるので、列値に対して操作を行うキャストを使用する際には常に注意を払う必要があります。
ネーム・スペースは、この名前を含むネーム・スペース・パス内ではそのネーム・スペースだけになるようにされます。 パス内に 1 つだけ存在できるネーム・スペースのことを、ターゲットなしネーム・スペースと呼びます。
これらの形式すべては、ネーム・スペースが導入される前からありました。 それらの形式が名前とネーム・スペースを比較するようになったという点では振る舞いに変更がありますが、すべての既存の変換はターゲットなしネーム・スペースにフィールドを作成するので、既存の変換に関しては動作に変更は見受けられません。
上記のすべての例において、中括弧 ({}) で囲まれた式で与えられた名前またはネーム・スペースは、ID として与えられた名前に相当します。
その名が示すように、ターゲットなしネーム・スペースの名前は空ストリングです。 空ストリングは、空ストリングとして評価される式、空の ID ""、または空ストリングとして定義されたネーム・スペース定数への参照によって選択できます。
フィールド参照を使用することは、普通既存フィールドの検索という意味でもあります。 しかし、必要なフィールドがない場合 (普通は SET ステートメントのターゲット、および SELECT 関数の AS 文節のターゲットであるフィールド参照の場合)、そのフィールドが作成されます。
タイプ指定がない場合、フィールドのタイプは Name または NameValue (これらは事実上、新規フィールドには名前がないことを示す) にはなりません。
.そのデフォルトはフィールド名や列名から導出されたものであるか、または単純に製造順序名である場合もあります。 名前がフィールド名であれば、これは実際にはツリー・コピーであり、ネーム・スペース名は上記のようにコピーされます。
それ以外の場合は、新規作成されたフィールドのネーム・スペースはパスを検索することによって導出されます。つまり、名前がフィールド参照の NameId 構文であるかのように扱われます。
SET OutputRoot.XMLNS.Msg.Data.Name = NULL; -- これはフィールドを削除します
SET OutputRoot.XMLNS.Msg.Data.Name VALUE = NULL;
-- これはフィールドを削除せずに NULL 値を割り当てます
以前のバージョンとの互換性のために、LAST キーワードは引き続きサポートされていますが、使用は推奨されていません。 LAST は索引式の一部としては使用できないため、[LAST] は有効で、[<] と同等ですが、[LAST3] は無効です。
Field [> ] -- The first field, equivalent to [ 1 ]
Field [> (a + b) * 2 ]
Field [ < ] -- The last field, equivalent to [ LAST ]
Field [ < 1 ] -- The last field, equivalent to [ LAST ]
Field [ < 2 ] -- The last but one field
Field [ < (a + b) / 3 ]