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引数は、実際の登録名と同様、大文字で指定する必要があります。