ESQL フィールド参照

このトピックでは、ESQL フィールド参照について説明します。

フィールド参照の完全な構文は、次のとおりです。
注: 変更の始まり全体的に名前またはアスタリスクを使用する必要があります。変更の終わり

[<] および [>] を使用することもできます。 < および > を使用した例を、以下の図に示します。

ユーザーへの注釈

以前のバージョンとの互換性のために、LAST キーワードは引き続きサポートされていますが、 使用は推奨されていません。LAST は索引式の一部としては使用できないため、 [LAST] は有効で、[<] と同等ですが、 [LAST3] は無効です。

LAST キーワードは次の矢印構文によって置き換えられており、 これにより検索の方向と索引の両方を指定することができます。
      Field [ > ]			-- The first element, equivalent to [ 1 ]
      Field [ > (a + b) * 2 ]
            Field [ < ]                       -- The last element, equivalent to [ LAST ]
            Field [ < 1 ]			-- The last element, equivalent to [ LAST ]
            Field [ < 2 ]			-- The last but one element
      Field [ < (a + b) / 3 ]

フィールド参照は、相関名、 およびその後に続くピリオド (.) で区切られたパス・エレメント (なくてもよい) から成っています。 . 相関名は、メッセージ・ツリー内の既知の開始点を示します。 したがって開始点は、宣言済みの参照変数か、 または事前定義済みの開始点の 1 つ (InputRoot など) のいずれかでなければなりません。 パス・エレメントは、開始点から希望のフィールドまでのパスを定義します。

以下に例を示します。
InputRoot.XML.Data.Invoice
ブローカーは InputRoot というロケーション (つまり、 Compute ノードへの入力メッセージのルート) から開始し、 ナビゲーションのシーケンスを実行します。 まず最初に、それはルートから最初の子フィールド「XML」までナビゲートし、 その後「XML」フィールドの最初の子フィールド「Data」までナビゲートします。 最後に、ブローカーは「Data」フィールドの最初の子フィールド「Invoice」までナビゲートします。 ESQL プログラム内でこのフィールド参照が生じた場合は常に、 送り状 (invoice) フィールドにアクセスします。
この形式のフィールド参照は、単純かつ便利なので、最もよく使用されます。 しかしながら、これには 2 つの制約があります。
  • 使用される名前は有効な ESQL ID でなければならず、 ESQL の規則に準拠する名前だけを使用できる、ということです。 つまり、名前に含めることのできるのは、英数字と下線だけであり、 先頭文字は数字であってはならず、名前の長さは最低 1 文字なければなりません。 これらの名前を二重引用符で囲むことによって、この制約を回避することができます。 以下に例を示します。
    InputRoot.XML."Customer Data".Invoice
    引用符を含むフィールドを参照する必要がある場合は、 参照の前後に 2 組の引用符を使用します。 以下に例を示します。
    Body.Message."""hello"""

    一部の ID はキーワードとして予約されていますが、これらの ID を二重引用符で囲んで、 キーワードとして解釈してはならないことを示すことができます。 たとえば、SET はキーワードです。 SET という名前のフィールドを含むメッセージがあり、 これ参照する場合は、Body."SET" とコーディングします。キーワードでは大文字小文字が区別されないので、SET、Set、および大文字小文字の他のすべての組み合わせは、キーワードとして認識されます。

    Invoice メッセージ内のエレメント Item は、この例の 1 つです。 Item は予約済みキーワードなので、このエレメントを参照する場合は、二重引用符で囲む必要があります。 以下に例を示します。

    InputBody.Invoice.Purchases."Item"[1].Author  
  • フィールドの名前が ESQL プログラム内に現れるので、 プログラムを書く時点で、それらがすでに分かっている必要があります。 この制約は、中括弧 ( { ... } ) を使用する代替構文を使用することによって、 回避することができます。 この構文では、タイプ文字のヌル以外の値を戻す任意の式を使用することができます。
    以下に例を示します。
    InputRoot.XML."Customer Data".{'Customer-' || 
    	CurrentCustomer}.Invoice
    この例では、文字リテラル Customer- を CurrentCustomer (これは、 タイプ文字の宣言済み変数でなければならない) 内の値と連結することによって形成される名前を 持つフォルダーに、送り状が含まれています。

ESQL では、二重引用符で囲めば ID となります。 また、単一引用符で囲めば、文字リテラルとなります。 すべての文字ストリング (CHARACTER、BLOB、または BIT) を単一引用符で囲む必要があります。

フィールド参照の既存の構文とその意味は、まったく変更されていません。 拡張された関数の主な機能は次のとおりです。
  • 各フィールド参照の各エレメント (名前文節を含むもの) には、指定された名前が属する ネーム・スペースを定義するネーム・スペース文節をも含めることができます。
  • 各ネーム・スペース名は、単純な ID か、または式 (中括弧で囲む) で定義することができます。 ID が宣言済みネーム・スペース定数の名前である場合は、 定数の値が使用されます。式を使用する場合、式から戻される値は、 タイプが文字のヌル以外の値でなければなりません。
  • ネーム・スペース文節の * は、エレメントをツリーに配置するときに、 ネーム・スペース情報が無視されることを明示的に示します。
  • ID、式、または * を取らない、つまり :present だけのネーム・スペース文節は、 ターゲットなしネーム・スペースを明示的にターゲットにします。
タイプ、ネーム・スペース、名前、および索引文節のさまざまな組み合わせの意味は、次のとおりです。
[..], *, *[..], (..), (..)[..], (..)*, (..)*[..]
これらの形式はすべて、名前またはネーム・スペースを指定しません。そのため、 ターゲット・エレメントはそのタイプと索引、またはその索引のみのいずれかを使って 位置指定されます。これらの形式すべては今回の変更より前から存在しており、 それらの動作はまったく変更されていません。
NameId, NameId[..], (..)NameId, (..)NameId[..]
これらの形式はすべて、名前を指定しますが、ネーム・スペースは指定しません。 ターゲット・エレメントの位置指定はネーム・スペースと名前を使って行われますが、 適切であればタイプと索引を使っても行われます。

ネーム・スペースは、この名前を含むネーム・スペース・パス内では そのネーム・スペースだけになるようにされます。ネーム・スペースが パス内で 1 つだけの場合は、ターゲットなしネーム・スペースです。

これらの形式すべては、変更前からありました。それらの形式が 名前とネーム・スペースを比較するようになったという点では振る舞いに変更がありますが、 すべての既存の変換はターゲットなしネーム・スペースにエレメントを作成するので、 既存の変換に関しては動作に変更は見受けられません。

:*, :*[..], (..):*, (..):*[..]
これらの形式はすべて、ターゲットなしネーム・スペースを指定しますが、 名前は指定しません。ターゲット・エレメントの位置指定はそのネーム・スペースを 使って行われますが、適切であればタイプと索引を使っても行われます。
:NameId, :NameId[..], (..):NameId, (..):NameId[..]
これらの形式はすべて、名前とターゲットなしネーム・スペースを指定します。 ターゲット・エレメントの位置指定はネーム・スペースと名前を使って行われ、 適切であればタイプと索引を使っても行われます。
*:*, *:*[..], (..)*:*, (..)*:*[..]
これらの形式はすべて、名前またはネーム・スペースを指定しません。 ターゲット・エレメントはそのタイプおよび索引、 またはその索引のみのいずれかを使って位置指定されます。
*:NameId, *:NameId[..], (..)*:NameId, (..)*:NameId[..]
これらの形式はすべて、名前を指定しますが、ネーム・スペースは指定しません。 ターゲット・エレメントの位置指定は名前を使って行われ、適切であればタイプと索引を 使っても行われます。
SpaceId:*, SpaceId:*[..], (..)SpaceId:*, (..)SpaceId:*[..]
これらの形式はすべて、ネーム・スペースを指定しますが、名前は指定しません。 ターゲット・エレメントの位置指定はネーム・スペースを使って行われ、適切であれば タイプと索引を使っても行われます。
SpaceId:NameId, SpaceId:NameId[..], (..)SpaceId:NameId, (..)SpaceId:NameId[..]
これらの形式はすべて、ネーム・スペースと名前を指定します。 ターゲット・エレメントの位置指定はネーム・スペースと名前を使って行われ、 適切であればタイプと索引を使っても行われます。

上記の例すべてにおいて、中括弧 ({}) で囲まれた式で 与えられた名前またはネーム・スペースは、ID として与えられた名前と等価です。

その名が示すように、ターゲットなしネーム・スペースの名前は空ストリングです。 空ストリングとして評価される式、つまり空 ID ""、または 空ストリングとして定義されたネーム・スペース定数への参照によって選択できます。

フィールド参照を使用することは、普通既存エレメントの検索という意味でもあります。 このことは、SET ステートメントのターゲット、 および SELECT ステートメントの AS 文節のターゲットであるフィールド参照にあてはまります。 必要なエレメントが存在しない場合は、作成されます。

これらの場合すべてにおいて、必要な名前またはネーム・スペースが何であるかをブローカーが 識別できないさまざまな状況があり、またこれらの状況においては以下の一般的な原則が適用されます。
  • 名前文節が欠けているか名前を指定しておらず、かつネーム・スペース文節が 欠けているかネーム・スペースを指定または暗黙指定していない場合 (つまり、 使用可能な名前またはネーム・スペースがない場合)、次のいずれかの状況が適用されます。
    • 割り当てアルゴリズムが特定の何かのエレメントから名前をコピーすることを選択 しない場合、新規エレメントはその名前とネーム・スペースの両方が 空ストリングに設定されるようにし、その名前フラグは自動的には設定されません

      タイプ指定がない場合、エレメントのタイプは Name または NameValue (これらは事実上、新規エレメントには名前がないことを示す) にはなりません。

      .
    • そうではなく、割り当てアルゴリズムが何かの既存のエレメントから名前をコピーする ことを選択する場合、新規エレメントはその名前とネーム・スペースの両方が既存の エレメントからコピーされるようにし、 その Name フラグは自動的に設定されます。
  • 名前文節は存在して名前を指定しているが、ネーム・スペース文節が欠けているか ネーム・スペースを指定または暗黙指定していない場合 (つまり、名前は使用可能だが ネーム・スペースが使用可能ではない場合)、新規エレメントは次のように設定されます。
    • Name は、与えられた値に設定される
    • Namespace は空ストリングに設定される
    • Name フラグは自動的に設定される
  • 名前文節が欠けているか名前を指定していないが、ネーム・スペース文節は存在し、 ネーム・スペースを指定または暗黙指定している場合 (つまり、ネーム・スペースは使用可能だが 名前が使用可能ではない場合)、新規エレメントは次のように設定されます。
    • Namespace は、与えられた値に設定される
    • Name は空ストリングに設定される
    • Name フラグは自動的に設定される
  • 名前文節は存在して名前を指定しており、かつネーム・スペース文節も存在し、 ネーム・スペースを指定または暗黙指定している場合、新規エレメントは次のように設定されます。
    • Name は、与えられた値に設定される
    • Namespace は、与えられた値に設定される
    • Name フラグは自動的に設定される
フィールド参照によって参照されるものに加えて、 ブローカーがエレメントを作成する場合もあります。
  • ツリー・コピー: 新規エレメントは、ソース・ツリーをテンプレートとして 使用するアルゴリズムによって作成されます。そのアルゴリズムがソース・エレメントの名前を 新規エレメントにコピーする場合、そのネーム・スペースもコピーされます。
  • 無名選択式: SELECT 文節に必ずしも AS 文節がなければならないということはなく、 SELECT 文節に AS 文節がない場合は、新規作成されたエレメントの名前がデフォルト値に 設定されます (SELECT 関数を参照)。

    そのデフォルトはエレメント名や列名から導出されたものであるか、 または単純に製造順序名である場合もあります。名前がエレメント名であれば、 これは実際にはツリー・コピーであり、ネーム・スペース名は上記のようにコピーされます。

    それ以外の場合は、新規作成されたエレメントのネーム・スペースは パスを検索することによって導出されます。 つまり、名前がフィールド参照の NameId 構文であるかのように扱われます。

フィールド参照のそれぞれのエレメントには、索引文節を含めることができます。 この文節は、大括弧 ( [ ... ] ) によって示され、 ヌル以外のタイプ整数を戻す式を入れることができます。 この文節は、同じ名前を持ついくつかのフィールドのうち、どれが選択されるのかを示します。 フィールドには、1 から始めて番号が付けられます。 この文節が存在しない場合には、 最初のフィールドが必要なものであると見なされます。 したがって、次の 2 つの例は、まったく同じ意味を持ちます。
InputRoot.XML.Data[1].Invoice
InputRoot.XML.Data.Invoice[1] 
この構成は、索引変数で最も一般的に使用されるもので、 ループは該当するすべてのフィールドを順番に処理します。 以下に例を示します。
WHILE count < 32 DO
          SET TOTAL = TOTAL + InputRoot.XML.Data.Invoice[count].Amount;
END WHILE;
この種の構成を使用するときには注意が必要です。 なぜなら、ループを回すたびに、ブローカーは最初からフィールドをカウントしなければならないことを意味するからです。 繰り返し数える負荷が大きければ、パフォーマンスが低下します。 そのような場合には、代わりにフィールド参照変数を使用したほうがよいでしょう。
索引式は任意で、その前により小符号 ( < ) を付けることができます。 これは、必須フィールドの索引付けが、最初のフィールドからではなく、 最後のフィールドから行われることを示します。 この場合、索引 1 は最後のエレメントを参照し、 索引 2 は最後から 2 番目のエレメントを参照します。 もちろん、最初のフィールドから数えることを示すために、 より大符号を使用することもできます。 以下の例は、「Invoice」という名前のフィールドが 4 つある索引を処理する ESQL コードを示しています。
InputRoot.XML.Data.Invoice       -- Selects the first
InputRoot.XML.Data.Invoice[1]    -- Selects the first
InputRoot.XML.Data.Invoice[>]    -- Selects the first
InputRoot.XML.Data.Invoice[>1]   -- Selects the first
InputRoot.XML.Data.Invoice[>2]   -- Selects the second
InputRoot.XML.Data.Invoice[<]    -- Selects the fourth
InputRoot.XML.Data.Invoice[<1]   -- Selects the fourth
InputRoot.XML.Data.Invoice[<2]   -- Selects the third
InputRoot.XML.Data.Invoice[<3]   -- Selects the second 
索引文節はまた、中が空の大括弧 ( [ ] ) にすることもできます。 名前が一致するすべてのフィールドを選択します。 この構成は、リストを作成する関数 (たとえば SELECT や CARDINALITY) で使用されます。

フィールド参照のそれぞれのエレメントには、タイプ文節を含めることができます。 タイプ文節は、小括弧 ( ( ) ) によって示され、 ヌル以外のタイプ整数を戻す式を入れることができます。タイプ式がある場合には、 選択されるフィールドは、タイプが一致するものだけに制限されます。 この構成は、最も一般的には汎用 XML とともに使用されます。 汎用 XML では、多数のエレメント・タイプがあり、1 つの XML エレメントが、 属性および同じ名前のさらに別の XML エレメントの両方を含むこともあります。

以下に例を示します。
<Item Value = '1234' >
     <Value>5678</Value>
</Item>
この例では、XML エレメント "Item" には、どちらも "Value" という 2 つの子エレメントがあります。 子エレメントはタイプ文節を使うことによって区別できます。属性を選択するには Item.(XML.Attribute)Value を使用し、 エレメントを選択するには Item.(XML.Element)Value を使用します。

関連概念
ESQL

関連タスク
ESQL の開発
エレメントの既知の複数の出現にアクセスする