XMLデータのリレーショナル・データベース・ビューでは、XMLコンテンツへの従来のリレーショナル・アクセスを提供します。
Oracle XML DBで提供されるXML特有の関数およびメソッドを使用すると、XMLコンテンツへのリレーショナル・アクセスを提供する、従来のデータベース・ビューを作成できます。これによって、Oracle Databaseには対処していてもXMLに対処しているとはかぎらないプログラマ、ツールおよびアプリケーションでも、データベースに格納されたXMLコンテンツを操作できます。
リレーショナル・ビューでは、XQuery式とXMLTableなどのSQL/XML関数を使用して、ビューの列とXML文書のノードとの間のマッピングを定義できます。
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)
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データに対する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'
ここでの例は、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.
脚注の凡例
脚注1:getSIDXDefFromViewに渡すview-name引数は、実際の登録名と同様、大文字で指定する必要があります。