ESQL フィールド参照

このトピックでは、メッセージ本体エレメントへのパスを形成するために ESQL フィールド参照を使用する方法について説明します。

フィールド参照の完全な構文は、次のとおりです。

フィールド参照は、相関名、およびその後に続くピリオド (.) で区切られたパス・フィールド (なくてもよい) から成っています。相関名は既知の開始点を示すので、定数、宣言済みの変数 (スカラー、行、または参照)、または事前定義済みの開始点の 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 もありますが、相関名は例外で、二重引用符を使用せずにフィールド参照を使用できます。

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

パス・エレメント内でアスタリスク (*) ワイルドカード文字を使用すれば、どんな名前にもマッチさせることができます。また、名前の一部分を指定するために "*" を使用することもできます。例えば、Prefix* は、"Prefix" で始まるすべての名前にマッチします。

ESQL では、二重引用符で囲めば ID となることに注意してください。また、単一引用符で囲めば、文字リテラルとなります。すべての文字ストリングを単一引用符で囲む必要があります。

以下を参照してください。

ネーム・スペース

フィールド名はネーム・スペースに属することができます。フィールド参照は、以下のようにネーム・スペースのサポートを提供します。
  • 各フィールド参照の各フィールド (名前文節を含むもの) には、指定された名前が属する ネーム・スペースを定義するネーム・スペース文節をも含めることができます。
  • 各ネーム・スペース名は、単純な ID か、または式 (中括弧で囲む) で定義することができます。ID が宣言済みネーム・スペース定数の名前である場合は、定数の値が使用されます。式を使用する場合、式から戻される値は、 タイプが文字のヌル以外の値でなければなりません。
  • ネーム・スペース文節の * は、フィールドをツリーに配置するときに、ネーム・スペース情報が無視されることを明示的に示します。
  • ID、式、または * を取らない、つまり :present だけのネーム・スペース文節は、ターゲットなしネーム・スペースを明示的にターゲットにします。

索引

フィールド参照のそれぞれのフィールドには、索引文節を含めることができます。この文節は、大括弧 ( [ ... ] ) によって示され、ヌル以外のタイプ整数を戻す式を入れることができます。この文節は、同じ名前を持ついくつかのフィールドのうち、どれが選択されるのかを示します。フィールドには、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;
     SET COUNT = COUNT + 1 
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、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. ScalarDataTypeNameは、BOOLEAN、INTEGER、INT、FLOAT、DECIMAL、DEC、DATE、TIME、TIMESTAMP、GMTTIME、GMTTIMESTAMP、INTERVAL、 CHARACTER、CHAR、BLOB、BIT のいずれでもかまいません。

通常はタイプ制約によって、(FIELDVALUE 関数と同様の方法で) 参照のスカラー値が抽出され、参照のタイプが正しくない場合は例外がスローされます。定義によると、存在しないフィールドはすべて NULL に評価されるので、例外がスローされます。これは、メッセージに重要なフィールドが欠落している場合に例外をスローするのに便利で早い方法です。

しかし、データベースに渡す候補の式でタイプ制約が生じた場合 (式が WHERE 文節中にある場合など) は、その情報を使用して、式をデータベースに渡せるかどうかが判別されます。このことは、データベース表の列に対して操作を行う CAST が WHERE 文節に含まれている場合に重要になることがあります。タイプ制約がない場合、この種の式をデータベースに渡せません。なぜなら、データベースが必要な変換を実行できるかどうかブローカーが識別できないからです。しかし、データ変換機能が非常に限定されているデータベースもあるので、列値に対して操作を行うキャストを使用する際には常に注意を払う必要があります。

要約

*, *[..], (..)*, (..)*[..]
これらの形式はすべて、名前またはネーム・スペースを指定しません。ターゲット・フィールドは、任意の名前 (任意のネーム・スペース、またはネーム・スペースなし) の可能性があります。これは単に、タイプ、索引、またはタイプと索引のうち、該当するものを使って位置指定されます。
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 構文であるかのように扱われます。

フィールドを NULL に設定することの影響

フィールドにヌル値を割り当てる際には注意してください。例えば、以下のコマンドは Name フィールドを削除 します。
 SET OutputRoot.XML.Msg.Data.Name = NULL;  -- これはフィールドを削除します
フィールドにヌル値を割り当てる正しい方法は以下のとおりです。
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL;
-- これはフィールドを削除せずに NULL 値を割り当てます
注: 後方互換性に関するユーザーへの注記

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

LAST キーワードは次の矢印構文によって置き換えられており、これにより検索の方向と索引の両方を指定することができます。
      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 ]
関連概念
ESQL の概要
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ak04861_