9 XMLデータのリレーショナル・ビュー
XMLデータのリレーショナル・データベース・ビューでは、XMLコンテンツへの従来のリレーショナル・アクセスを提供します。
- XMLデータのリレーショナル・ビューの作成および使用の概要
Oracle XML DBで提供されるXML特有の関数およびメソッドを使用すると、XMLコンテンツへのリレーショナル・アクセスを提供する、従来のデータベース・ビューを作成できます。これによって、Oracle Databaseには対処していてもXMLに対処しているとはかぎらないプログラマ、ツールおよびアプリケーションでも、データベースに格納されたXMLコンテンツを操作できます。 - XMLのリレーショナル・ビューの作成: XML文書ごとに1行
XMLType
表内の各文書をリレーショナル・ビューの行として公開するには、CREATE OR REPLACE VIEW AS SELECT
を使用し、XMLType
表と、SQL/XML関数XMLTable
を使用してXMLデータから作成したリレーショナル表とを結合して抽出します。 - XMLのリレーショナル・ビューの作成: XMLノードの列へのマップ
XMLType
表の複数のレベルからのデータをリレーショナル・ビューの個別の行として公開するには、各レベルにSQL/XML関数XMLTable
を適用します。この方法は、XMLType
表内の文書とビュー内の行の間に、1対多(1:N)関係がある場合はいつでも使用できます。 - リレーショナル・ビューを使用して公開されたバイナリXMLデータの索引付け
バイナリXMLデータに対するXMLIndex
索引の構造化コンポーネントのリレーショナル列が、そのデータに対するリレーショナル・ビューの列と一致する場合は、実質的に、そのビューも索引付けされます。 - リレーショナル・データとしてのXMLコンテンツの問合せ
ここでの例は、XMLデータのリレーショナル問合せを示しています。これらの例では、XMLType
表および列に対してリレーショナル・ビューを作成するメリットをいくつか示します。
親トピック: XMLデータに対するリレーショナル・データ
9.1 XMLデータのリレーショナル・ビューの作成および使用の概要
Oracle XML DBで提供されるXML特有の関数およびメソッドを使用すると、XMLコンテンツへのリレーショナル・アクセスを提供する、従来のデータベース・ビューを作成できます。これによって、Oracle Databaseには対処していてもXMLに対処しているとはかぎらないプログラマ、ツールおよびアプリケーションでも、データベースに格納されたXMLコンテンツを操作できます。
リレーショナル・ビューでは、XQuery式とXMLTable
などのSQL/XML関数を使用して、ビューの列と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では、XMLType
表po_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)
親トピック: XMLデータのリレーショナル・ビュー
9.3 XMLのリレーショナル・ビューの作成: XMLノードの列へのマップ
XMLType
表の複数のレベルからのデータをリレーショナル・ビューの個別の行として公開するには、各レベルにSQL/XML関数XMLTable
を適用します。この方法は、XMLType
表内の文書とビュー内の行の間に、1対多(1:N)関係がある場合はいつでも使用できます。
つまり、ビューを構成する列を定義し、XMLノードをその列にマップするという、単一レベルの分割(XMLのリレーショナル・ビューの作成: XML文書ごとに1行を参照)と同じ一般的な方法を使用します。ただし、この場合は、分割してリレーショナル列に格納する各文書レベルにXMLTable
を適用します。
たとえば、各PurchaseOrder
要素にLineItems
要素が含まれていて、この要素に1つ以上のLineItem
要素が含まれているとします。各LineItem
要素には、Description
やItemNumber
属性などの子要素があります。このような下位レベルのデータをリレーショナル値としてアクセス可能にするには、XMLTable
を使用してPurchaseOrder
要素とLineItem
コレクションの両方を投影します。
要素PurchaseOrder
を分割すると、その子孫であるLineItem
要素は、XMLフラグメントが含まれている型XMLType
の列にマップされます。この列は次に、XMLTable
への2回目のコールに渡され、リレーショナル値の複数の列として複数の部分に分割されます。
例9-2に、これを示します。ここでは、XMLTable
を使用して、XMLType表po_binaryxml
内の文書とリレーショナル・ビューpurchaseorder_detail_view
内の行との間に1対多
(1:N)の関係をもたらします。このビューはコレクションの個別のメンバーへのアクセスを提供し、コレクション・メンバーを行のセットとして公開します。
例9-2では、ビューpurchaseorder_detail_view
の各行は、XMLType
表po_binaryxml
に格納されているXML文書内の各LineItem
要素に対応しています。
例9-2
のCREATE OR REPLACE VIEW文では、ビューを構成する一連のリレーショナル列を定義します。SELECT
文は、コンテキストとしてpo_binaryxml
表を関数XMLTable
に渡し、列reference
およびlineitem
を含む、仮想表p
を作成します。これらの列には、発注書のReference
およびLineItem
要素がそれぞれ含まれます。
列lineitem
にはLineItem
要素のコレクションがXMLType
インスタンスとして含まれ、各行が各要素に対応します。これらの行は次に、2つ目のXMLTable
式に渡され、そのコンテキストとして機能します。この2つ目のXMLTable
式により、明細/項目行の仮想表が作成され、各列が要素LineItem
の様々な子孫ノードに対応します。これらの子孫の大半は属性(ItemNumber
やPart/@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)
親トピック: XMLデータのリレーショナル・ビュー
9.4 リレーショナル・ビューを使用して公開されたバイナリXMLデータの索引付け
バイナリXMLデータに対するXMLIndex
索引の構造化コンポーネントのリレーショナル列が、そのデータに対するリレーショナル・ビューの列と一致する場合は、実質的に、そのビューも索引付けされます。
リレーショナル・ビューで公開されるXMLType
データがバイナリXMLとして格納されている場合、ビューの列に対応する構造化コンポーネントを含むXMLIndex
索引を作成すれば、通常はパフォーマンスを向上できます。このような索引は、ビューの動作と同じように、XMLデータの部分をリレーショナル列に投影します。索引の列とビューの列が一致する場合、ビュー自体が索引付けされます。
このようなXMLIndex
索引の作成を簡単にするには、PL/SQLファンクションDBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView
を使用すれば、索引の作成に必要なXMLTable
式を正確に記述できます。それがこの関数の唯一の機能で、リレーショナル・ビュー用のXMLIndex
索引の作成に使用できるXMLTable
式を戻します。ビューを引数として取得し、CLOB
インスタンスを戻します。例9-3に、これを示します。
関連項目:
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'
関連トピック
親トピック: XMLデータのリレーショナル・ビュー
9.5 リレーショナル・データとしてのXMLコンテンツの問合せ
ここでの例は、XMLデータのリレーショナル問合せを示しています。これらの例では、XMLType
表および列に対してリレーショナル・ビューを作成するメリットをいくつか示します。
例9-5および例9-6に、XMLデータのマスターおよび詳細なリレーショナル・ビューの問合せ方法を示します。例9-5では、マスター・ビューに問い合せ、列userid
がS
で始まる行を検索します。
例9-6ではマスター・ビューと詳細ビューを結合します。itemno
列の値が1
で、対応するpurchaseorder_master_view
の行に値がSBELL
のuserid
列が含まれている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.
親トピック: XMLデータのリレーショナル・ビュー
脚注の説明
脚注1:getSIDXDefFromView
に渡すview-name引数は、実際の登録名と同様、大文字で指定する必要があります。