Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » システム・オブジェクト » システム・プロシージャ » システム・プロシージャのアルファベット順リスト

 

openxml システム・プロシージャ

XML ドキュメントから結果セットを生成します。

構文
openxml( xml-data,
 xpath [, flags [, namespaces ] ] )
WITH ( column-name column-type [ xpath ],... )
引数
  • xml_data   結果セットのベースとなる XML。定数、変数、カラムなど、任意の文字列式が使用できます。

  • xpath   XPath クエリを含む文字列。XPath を使用すると、クエリ対象の XML ドキュメントの構造を記述するパターンを指定できます。この引数にある XPath パターンによって、XML ドキュメントからノードが選択されます。2 番目の xpath 引数の XPath クエリに一致する各ノードが、テーブルにローを 1 つずつ生成します。

    WITH 句の xpath 引数に指定できるのは、メタプロパティのみです。メタプロパティは、属性として XPath クエリ内でアクセスされます。namespaces が指定されていない場合、デフォルトでプレフィクス mp が Uniform Resource Identifier (URI) urn:ianywhere-com:sa-xpath-metaprop にバインドされます。namespaces が指定された場合、この URI は、クエリのメタプロパティにアクセスするために mp または他のプレフィクスにバインドされます。メタプロパティ名の大文字と小文字は区別されます。openxml 文は、次のメタプロパティをサポートします。

    • @mp:id   XML ドキュメント内のユニークなノードの ID を返します。データベース・サーバが再起動されると、ドキュメント内の指定されたノードの ID が変更される場合もあります。このメタプロパティの値は、ドキュメントの順序で増えていきます。

    • @mp:localname   ノードの名前のローカル部分を返します。ノードに名前がない場合は NULL を返します。

    • @mp:prefix   ノードの名前のプレフィクス部分を返します。ノードに名前がない場合またはプレフィクスが付いていない場合は NULL を返します。

    • @mp:namespaceuri   ノードが含まれているネームスペースの URI を返します。ノードがネームスペースに含まれていない場合は NULL を返します。

    • @mp:xmltext   XML ドキュメントのサブツリーを XML 形式で返します。たとえば、内部ノードを照合する場合、このメタプロパティを使用して、下位のテキスト・ノードの連結値ではなく、XML 文字列を返します。

  • flags   WITH 句に XPath クエリが指定されていない場合、XML データと結果セットの間で使用されるマッピングを示します。flags パラメータが指定されない場合、デフォルトで結果セットのカラムに属性がマッピングされます。flags パラメータには、次のいずれかの値を指定します。

    説明
    1 XML 属性が結果セットのカラムにマッピングされます (デフォルト)。
    2 XML 要素が結果セットのカラムにマッピングされます。

  • namespace-declaration   XML ドキュメント。クエリに対するスコープ内のネームスペースは、文書のルート要素から取得されます。ネームスペースを指定しない場合、すべての xpath 引数が指定されていても、必ず flags 引数を含めます。

  • WITH 句   結果セットのスキーマと、結果セットの各カラムに対して値を見つける方法を指定します。WITH 句の xpath 引数は、2 番目の引数の xpath に対する一致と相対的に一致します。WITH 句の式が複数のノードと一致した場合、ドキュメントの順序における最初のノードだけが使用されます。ノードがテキスト・ノードではない場合、テキスト・ノードの下位ノードをすべて追加することにより結果を検索します。WITH 句の式がどのノードにも一致しない場合は、そのローのカラムは NULL になります。

    openxml の WITH 句構文は、ストアド・プロシージャから選択する際に使用する構文と似ています。

    ストアド・プロシージャからの選択については、FROM 句を参照してください。

  • column-name   結果セットのカラムの名前。

  • column-type   結果セットのカラムのデータ型。データ型は、XML ドキュメントから選択した値と互換性がなければなりません。SQL データ型を参照してください。

使用法

openxml システム・プロシージャは、xml-data を解析し結果をツリーとして、雛型化します。ツリーには、要素、属性、テキスト・ノード、その他の XML 構成要素ごとに個別のノードがあります。openxml システム・プロシージャに指定される XPath クエリは、ツリーからノードを選択する際に使用され、選択されたノードはその後、結果セットにマッピングされます。

openxml システム・プロシージャで使用される XML パーサは妥当性が検証されず、外部 DTD サブセットまたは外部パラメータのエンティティを読み取りません。

カラム式に複数の一致がある場合、ドキュメントの順序 (解析される前の元の XML ドキュメントの順序) における最初の一致が使用されます。一致するノードがない場合は、NULL が返されます。内部ノードが選択される場合、結果は連結された内部ノードの下位のテキスト・ノードすべてになります。

データ型が BINARY、LONG BINARY、IMAGE、VARBINARY のカラムは、base64 エンコード形式と見なされ、自動的に復号化されます。FOR XML 句を使用して XML を生成した場合、これらのタイプは base64 エンコードであり、openxml システム・プロシージャを使用して復号化できます。FOR XML とバイナリ・データを参照してください。

openxml システム・プロシージャは、XPath 構文のサブセットを次のようにサポートしています。

  • 子、自分、属性、子孫、子孫と自分、親は、完全にサポートされています。

  • 省略形または省略形ではない構文のどちらも、サポートされるすべての機能に使用できます。たとえば、'a''child::a' に等しく、'..''parent::node()' と同じです。

  • 名前のテストにワイルドカードが使用できます。たとえば、'a/*/b' のようになります。

  • サポートされるテストの種類は、node()、text()、processing-instruction()、comment() です。

  • フォーム expr1[expr2] and expr1[expr2="string" ] の修飾子を使用できます。この expr2 はサポートされている XPath 式です。expr2 が 1 つ以上のノードと一致する場合、修飾子は TRUE と評価されます。たとえば、'a[b]' は、少なくとも 1 つの子 b を持つ a ノードを検索します。a[b="I"] は、テキスト値 I を持つ子 b を少なくとも 1 つ持つ a ノードを検索します。

参照

次のクエリは、openxml システム・プロシージャへの最初の引数として指定された XML ドキュメントから結果セットを生成します。

SELECT * FROM openxml( '<products>
                 <ProductType ID="301">Tee Shirt</ProductType>
                 <ProductType ID="401">Baseball Cap</ProductType>
                 </products>',
                 '/products/ProductType' )
WITH ( ProductName LONG VARCHAR 'text()', ProductID CHAR(3) '@ID');

このクエリは、次の結果を生成します。

ProductName ProductID
Tee Shirt 301
Baseball Cap 401

次の例では、最初の <ProductType> 要素にエンティティがあります。クエリを実行すると、このノードは、Tee、&amp;、Sweater、Set の 4 つの子がある要素として解析されます。結果セット内で子を連結するには、. を使用します。

SELECT * FROM openxml( '<products>
                 <ProductType ID="301">Tee &amp; Sweater Set</ProductType>
                 <ProductType ID="401">Baseball Cap</ProductType>
                 </products>',
                 '/products/ProductType' )
WITH ( ProductName LONG VARCHAR '.', ProductID CHAR(3) '@ID');

このクエリは、次の結果を生成します。

ProductName ProductID
Tee Shirt & Sweater Set 301
Baseball Cap 401

次のクエリは、等号述部を使用して、指定された XML ドキュメントから結果セットを生成します。

SELECT * FROM openxml('<EmployeeDirectory>
   <Employee>
      <column name="EmployeeID">105</column>
      <column name="GivenName">Matthew</column>
      <column name="Surname">Cobb</column>
      <column name="Street">7 Pleasant Street</column>
      <column name="City">Grimsby</column>
      <column name="State">UT</column>
      <column name="PostalCode">02154</column>
      <column name="Phone">6175553840</column>
   </Employee>
  <Employee>
      <column name="EmployeeID">148</column>
      <column name="GivenName">Julie</column>
      <column name="Surname">Jordan</column>
      <column name="Street">1244 Great Plain Avenue</column>
      <column name="City">Woodbridge</column>
      <column name="State">AZ</column>
      <column name="PostalCode">01890</column>
      <column name="Phone">6175557835</column>
   </Employee>
  <Employee>
      <column name="EmployeeID">160</column>
      <column name="GivenName">Robert</column>
      <column name="Surname">Breault</column>
      <column name="Street">358 Cherry Street</column>
      <column name="City">Milton</column>
      <column name="State">PA</column>
      <column name="PostalCode">02186</column>
      <column name="Phone">6175553099</column>
   </Employee>
  <Employee>
      <column name="EmployeeID">243</column>
      <column name="GivenName">Natasha</column>
      <column name="Surname">Shishov</column>
      <column name="Street">151 Milk Street</column>
      <column name="City">Grimsby</column>
      <column name="State">UT</column>
      <column name="PostalCode">02154</column>
      <column name="Phone">6175552755</column>
   </Employee> 
</EmployeeDirectory>', '/EmployeeDirectory/Employee')
WITH ( EmployeeID INT 'column[@name="EmployeeID"]',
       GivenName    CHAR(20) 'column[@name="GivenName"]',
       Surname      CHAR(20) 'column[@name="Surname"]',
       PhoneNumber  CHAR(10) 'column[@name="Phone"]');

このクエリは、次の結果セットを生成します。

EmployeeID GivenName Surname PhoneNumber
105 Matthew Cobb 6175553840
148 Julie Jordan 6175557835
160 Robert Breault 6175553099
243 Natasha Shishov 6175552755

次のクエリは、XPath @attribute 式を使用して結果セットを生成します。

SELECT * FROM openxml( '<Employee
      EmployeeID="105"
      GivenName="Matthew"
      Surname="Cobb"
      Street="7 Pleasant Street"
      City="Grimsby"
      State="UT"
      PostalCode="02154"
      Phone="6175553840"
/>', '/Employee' )
WITH ( EmployeeID INT '@EmployeeID',
       GivenName    CHAR(20) '@GivenName',
       Surname      CHAR(20) '@Surname',
       PhoneNumber  CHAR(10) '@Phone');

次のクエリは、上記のクエリで使用されているような XML ドキュメント (ただし、XML 名前空間は使用されています) を操作します。XPath クエリに名前のテストにワイルド・カードを使用し、上記のクリックと同じ結果セットを生成する例です。

SELECT * FROM openxml( '<Employee  xmlns="http://www.iAnywhere.com/EmployeeDemo"
      EmployeeID="105"
      GivenName="Matthew"
      Surname="Cobb"
      Street="7 Pleasant Street"
      City="Grimsby"
      State="UT"
      PostalCode="02154"
      Phone="6175553840"
/>', '/*:Employee' )

WITH ( EmployeeID INT '@EmployeeID',
       GivenName    CHAR(20) '@GivenName',
       Surname      CHAR(20) '@Surname',
       PhoneNumber  CHAR(10) '@Phone');

または、名前空間の宣言を指定することもできます。

SELECT * FROM openxml( '<Employee  xmlns="http://www.iAnywhere.com/EmployeeDemo"
      EmployeeID="105"
      GivenName="Matthew"
      Surname="Cobb"
      Street="7 Pleasant Street"
      City="Grimsby"
      State="UT"
      PostalCode="02154"
      Phone="6175553840"
/>', '/prefix:Employee', 1, '<r xmlns:prefix="http://www.iAnywhere.com/EmployeeDemo"/>' )
WITH ( EmployeeID INT '@EmployeeID',
       GivenName    CHAR(20) '@GivenName',
       Surname      CHAR(20) '@Surname',
       PhoneNumber  CHAR(10) '@Phone');

openxml システム・プロシージャの使用例については、openxml を使用した XML のインポートを参照してください。