9 XMLデータのリレーショナル・ビュー

XMLデータのリレーショナル・データベース・ビューでは、XMLコンテンツへの従来のリレーショナル・アクセスを提供します。

9.1 XMLデータのリレーショナル・ビューの作成および使用の概要

Oracle XML DBで提供されるXML特有の関数およびメソッドを使用すると、XMLコンテンツへのリレーショナル・アクセスを提供する、従来のデータベース・ビューを作成できます。これによって、Oracle Databaseには対処していてもXMLに対処しているとはかぎらないプログラマ、ツールおよびアプリケーションでも、データベースに格納されたXMLコンテンツを操作できます。

リレーショナル・ビューでは、XQuery式とXMLTableなどのSQL/XML関数を使用して、ビューの列とXML文書のノードとの間のマッピングを定義できます。

9.2 XMLのリレーショナル・ビューの作成: XML文書ごとに1行

XMLType表内の各文書をリレーショナル・ビューの行として公開するには、CREATE OR REPLACE VIEW AS SELECTを使用し、XMLType表と、SQL/XML関数XMLTableを使用してXMLデータから作成したリレーショナル表とを結合して抽出します。

標準SQL/XML関数XMLTableを使用して、XML文書のノードをビューの列にマップできます。この方法は、XMLType表内の文書とビュー内の行の間に、1対1 (1:1)の関係がある場合はいつでも使用できます。

例9-1では、XMLTypepo_binaryxmlの行ごとに1行ずつ含む、リレーショナル・ビューpurchaseorder_master_viewを作成します。

例9-1 XMLコンテンツのリレーショナル・ビューの作成

CREATE TABLE po_binaryxml OF XMLType
  XMLTYPE STORE AS BINARY XML;

INSERT INTO po_binaryxml SELECT OBJECT_VALUE FROM OE.purchaseorder;

CREATE OR REPLACE VIEW purchaseorder_master_view AS
  SELECT po.*
    FROM po_binaryxml pur,
         XMLTable(
           '$p/PurchaseOrder' PASSING pur.OBJECT_VALUE as "p"
           COLUMNS
             reference       VARCHAR2(30)   PATH 'Reference',
             requestor       VARCHAR2(128)  PATH 'Requestor',
             userid          VARCHAR2(10)   PATH 'User',
             costcenter      VARCHAR2(4)    PATH 'CostCenter',
             ship_to_name    VARCHAR2(20)   PATH 'ShippingInstructions/name',
             ship_to_address VARCHAR2(256)  PATH 'ShippingInstructions/address',
             ship_to_phone   VARCHAR2(24)   PATH 'ShippingInstructions/telephone',
             instructions    VARCHAR2(2048) PATH 'SpecialInstructions') po;

View created.

DESCRIBE purchaseorder_master_view

Name            Null?    Type
--------------------------------------------
REFERENCE                VARCHAR2(30)
REQUESTOR                VARCHAR2(128)
USERID                   VARCHAR2(10)
COSTCENTER               VARCHAR2(4)
SHIP_TO_NAME             VARCHAR2(20)
SHIP_TO_ADDRESS          VARCHAR2(256)
SHIP_TO_PHONE            VARCHAR2(24)
INSTRUCTIONS             VARCHAR2(2048)

9.3 XMLのリレーショナル・ビューの作成: XMLノードの列へのマップ

XMLType表の複数のレベルからのデータをリレーショナル・ビューの個別の行として公開するには、各レベルにSQL/XML関数XMLTableを適用します。この方法は、XMLType表内の文書とビュー内の行の間に、1対(1:N)関係がある場合はいつでも使用できます。

つまり、ビューを構成する列を定義し、XMLノードをその列にマップするという、単一レベルの分割(XMLのリレーショナル・ビューの作成: XML文書ごとに1行を参照)と同じ一般的な方法を使用します。ただし、この場合は、分割してリレーショナル列に格納する各文書レベルにXMLTableを適用します。

たとえば、各PurchaseOrder要素にLineItems要素が含まれていて、この要素に1つ以上のLineItem要素が含まれているとします。各LineItem要素には、DescriptionItemNumber属性などの子要素があります。このような下位レベルのデータをリレーショナル値としてアクセス可能にするには、XMLTableを使用してPurchaseOrder要素とLineItemコレクションの両方を投影します。

要素PurchaseOrderを分割すると、その子孫であるLineItem要素は、XMLフラグメントが含まれている型XMLTypeの列にマップされます。この列は次に、XMLTableへの2回目のコールに渡され、リレーショナル値の複数の列として複数の部分に分割されます。

例9-2に、これを示します。ここでは、XMLTableを使用して、XMLTypepo_binaryxml内の文書とリレーショナル・ビューpurchaseorder_detail_view内の行との間に1対(1:N)の関係をもたらします。このビューはコレクションの個別のメンバーへのアクセスを提供し、コレクション・メンバーを行のセットとして公開します。

例9-2では、ビューpurchaseorder_detail_viewの各行は、XMLTypepo_binaryxmlに格納されているXML文書内の各LineItem要素に対応しています。

例9-2CREATE OR REPLACE VIEW文では、ビューを構成する一連のリレーショナル列を定義します。SELECT文は、コンテキストとしてpo_binaryxml表を関数XMLTableに渡し、列referenceおよびlineitemを含む、仮想表pを作成します。これらの列には、発注書のReferenceおよびLineItem要素がそれぞれ含まれます。

lineitemにはLineItem要素のコレクションがXMLTypeインスタンスとして含まれ、各行が各要素に対応します。これらの行は次に、2つ目のXMLTable式に渡され、そのコンテキストとして機能します。この2つ目のXMLTable式により、明細/項目行の仮想表が作成され、各列が要素LineItemの様々な子孫ノードに対応します。これらの子孫の大半は属性(ItemNumberPart/@Idなど)です。子孫の1つは子要素Descriptionです。

要素Referenceは、列referenceとしてビューpurchaseorder_detail_viewに投影されます。ビューpurchaseorder_detail_viewの行をビューpurchaseorder_master_viewの対応する行に結合するのに使用できる外部キーを提供します。CREATE OR REPLACE VIEW文の相関結合によって、ビューにアクセスするたびに、要素Referenceと、関連するLineItem要素の間の1対多(1:N)の関係が保持されます。

例9-2 ビューを使用したコレクションの各メンバーへのアクセス

CREATE OR REPLACE VIEW purchaseorder_detail_view AS
  SELECT po.reference, li.*
    FROM po_binaryxml p,
         XMLTable('/PurchaseOrder' PASSING p.OBJECT_VALUE
                  COLUMNS
                    reference VARCHAR2(30) PATH 'Reference',
                    lineitem  XMLType      PATH 'LineItems/LineItem') po,
         XMLTable('/LineItem' PASSING po.lineitem
                  COLUMNS
                    itemno      NUMBER(38)    PATH '@ItemNumber',
                    description VARCHAR2(256) PATH 'Description',
                    partno      VARCHAR2(14)  PATH 'Part/@Id',
                    quantity    NUMBER(12, 2) PATH 'Part/@Quantity',
                    unitprice   NUMBER(8, 4)  PATH 'Part/@UnitPrice') li;

View created.

DESCRIBE purchaseorder_detail_view
Name           Null?    Type
----------------------------
REFERENCE               VARCHAR2(30)
ITEMNO                  NUMBER(38)
DESCRIPTION             VARCHAR2(256)
PARTNO                  VARCHAR2(14)
QUANTITY                NUMBER(12,2)
UNITPRICE               NUMBER(8,4)

9.4 リレーショナル・ビューを使用して公開されたバイナリXMLデータの索引付け

バイナリXMLデータに対するXMLIndex索引の構造化コンポーネントのリレーショナル列が、そのデータに対するリレーショナル・ビューの列と一致する場合は、実質的に、そのビューも索引付けされます。

リレーショナル・ビューで公開されるXMLTypeデータがバイナリXMLとして格納されている場合、ビューの列に対応する構造化コンポーネントを含むXMLIndex索引を作成すれば、通常はパフォーマンスを向上できます。このような索引は、ビューの動作と同じように、XMLデータの部分をリレーショナル列に投影します。索引の列とビューの列が一致する場合、ビュー自体が索引付けされます。

このようなXMLIndex索引の作成を簡単にするには、PL/SQLファンクションDBMS_XMLSTORAGE_MANAGE.getSIDXDefFromViewを使用すれば、索引の作成に必要なXMLTable式を正確に記述できます。それがこの関数の唯一の機能で、リレーショナル・ビュー用のXMLIndex索引の作成に使用できるXMLTable式を戻します。ビューを引数として取得し、CLOBインスタンスを戻します。例9-3に、これを示します。

例9-4に、例9-3で使用したXMLTable式を示します。

関連項目:

PL/SQLファンクションDBMS_XMLSTORAGE_MANAGE.getSIDXDefFromViewの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

例9-3 リレーショナル・ビューの列に対応するXMLIndex索引

CALL DBMS_XMLINDEX.registerParameter(
  'my_param',
  DBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView('PURCHASEORDER_MASTER_VIEW'));Foot 1

CREATE INDEX my_idx on po_binaryxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
  PARAMETERS ('PARAM my_param');

例9-4 PL/SQL関数getSIDXDefFromViewによって戻されたXMLTable式

SELECT DBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView('PURCHASEORDER_MASTER_VIEW')
  FROM DUAL;

XMLTABLE po_binaryxml_XTAB_1 '/PurchaseOrder' PASSING OBJECT_VALUE
  COLUMNS
    reference       VARCHAR2   (30) PATH 'Reference',
    requestor       VARCHAR2  (128) PATH 'Requestor',
    userid          VARCHAR2   (10) PATH 'User',
    costcenter      VARCHAR2    (4) PATH 'CostCenter',
    ship_to_name    VARCHAR2   (20) PATH 'ShippingInstructions/name',
    ship_to_address VARCHAR2  (256) PATH 'ShippingInstructions/address',
    ship_to_phone   VARCHAR2   (24) PATH 'ShippingInstructions/telephone',
    instructions    VARCHAR2 (2048) PATH 'SpecialInstructions'

9.5 リレーショナル・データとしてのXMLコンテンツの問合せ

ここでの例は、XMLデータのリレーショナル問合せを示しています。これらの例では、XMLType表および列に対してリレーショナル・ビューを作成するメリットをいくつか示します。

例9-5および例9-6に、XMLデータのマスターおよび詳細なリレーショナル・ビューの問合せ方法を示します。例9-5では、マスター・ビューに問い合せ、列useridSで始まる行を検索します。

例9-6ではマスター・ビューと詳細ビューを結合します。itemno列の値が1で、対応するpurchaseorder_master_viewの行に値がSBELLuserid列が含まれているpurchaseorder_detail_viewの行を検索します。

例9-7では、XMLコンテンツのリレーショナル・ビューを使用して、XML文書のビジネス・インテリジェンス問合せを実行する方法を示します。この例の問合せは、タイトルがUPCコード715515009058および715515009126で識別される発注を含むPurchaseOrder文書を選択します。

例9-7の問合せは、PurchaseOrder文書ごとに、発注された各映画タイトルの本数を判別します。たとえば、部品番号715515009126には、発注された品目の本数が1のPurchaseOrder文書は4つあり、発注された品目の本数が3のPurchaseOrder文書は7つあります。

例9-5 XMLデータのマスター・リレーショナル・ビューの問合せ

SELECT reference, costcenter, ship_to_name
  FROM purchaseorder_master_view
  WHERE userid LIKE 'S%';
 
REFERENCE                      COST SHIP_TO_NAME
------------------------------ ---- --------------
SBELL-20021009123336231PDT     S30  Sarah J. Bell
SBELL-20021009123336331PDT     S30  Sarah J. Bell
SKING-20021009123336321PDT     A10  Steven A. King
...
36 rows selected.

例9-6 XMLデータのマスターおよび詳細なリレーショナル・ビューの問合せ

SELECT d.reference, d.itemno, d.partno, d.description
  FROM purchaseorder_detail_view d, purchaseorder_master_view m
  WHERE m.reference = d.reference
    AND m.userid = 'SBELL'
    AND d.itemno = 1;

REFERENCE                          ITEMNO PARTNO         DESCRIPTION
------------------------------ ------------------------------------------------
SBELL-20021009123336231PDT              1 37429165829    Juliet of the Spirits
SBELL-20021009123336331PDT              1 715515009225   Salo
SBELL-20021009123337353PDT              1 37429141625    The Third Man
SBELL-20021009123338304PDT              1 715515009829   Nanook of the North
SBELL-20021009123338505PDT              1 37429122228    The 400 Blows
SBELL-20021009123335771PDT              1 37429139028    And the Ship Sails on
SBELL-20021009123335280PDT              1 715515011426   All That Heaven Allows
SBELL-2002100912333763PDT               1 715515010320   Life of Brian - Python
SBELL-2002100912333601PDT               1 715515009058   A Night to Remember
SBELL-20021009123336362PDT              1 715515012928   In the Mood for Love
SBELL-20021009123336532PDT              1 37429162422    Wild Strawberries
SBELL-20021009123338204PDT              1 37429168820    Red Beard
SBELL-20021009123337673PDT              1 37429156322    Cries and Whispers

13 rows selected.

例9-7 ビューを使用したXMLデータのビジネス・インテリジェンス問合せ

SELECT partno, count(*) "No of Orders", quantity "No of Copies"
  FROM purchaseorder_detail_view
  WHERE partno IN (715515009126, 715515009058)
  GROUP BY rollup(partno, quantity);
 
PARTNO         No of Orders No of Copies
-------------- ------------ ------------
715515009058              7            1
715515009058              9            2
715515009058              5            3
715515009058              2            4
715515009058             23
715515009126              4            1
715515009126              7            3
715515009126             11
                         34 
9 rows selected.


脚注の説明

脚注1:

getSIDXDefFromViewに渡すview-name引数は、実際の登録名と同様、大文字で指定する必要があります。