9 Relational Views over XML Data
Relational database views over XML data provide conventional, relational access to XML content.
- Introduction to Creating and Using Relational Views over XML Data
You can use the XML-specific functions and methods provided by Oracle XML DB to create conventional database views that provide relational access to XML content. This lets programmers, tools, and applications that understand Oracle Database, but not necessarily XML, work with XML content stored in the database. - Creating a Relational View over XML: One Row for Each XML Document
To expose each document in anXMLTypetable as a row in a relational view, useCREATE OR REPLACE VIEW AS SELECT, selecting from a join of theXMLTypetable and a relational table that you create from the XML data using SQL/XML functionXMLTable. - Creating a Relational View over XML: Mapping XML Nodes to Columns
To expose data from multiple levels of anXMLTypetable as individual rows in a relational view, apply SQL/XML functionXMLTableto each level. Use this technique whenever there is a one-to-many (1:N) relationship between documents in theXMLTypetable and rows in the view. - Indexing Binary XML Data Exposed Using a Relational View
If the relational columns of the structured component of anXMLIndexindex over binary XML data match the columns of a relational view over that data, then the view too is effectively indexed. - Querying XML Content As Relational Data
Examples here show relational queries of XML data. They illustrate some of the benefits provided by creating relational views overXMLTypetables and columns.
Parent topic: Relational Data To and From XML Data
9.1 Introduction to Creating and Using Relational Views over XML Data
You can use the XML-specific functions and methods provided by Oracle XML DB to create conventional database views that provide relational access to XML content. This lets programmers, tools, and applications that understand Oracle Database, but not necessarily XML, work with XML content stored in the database.
The relational views can use XQuery expressions and SQL/XML functions such as XMLTable to define a mapping between columns in the view and nodes in an XML document.
Related Topics
Parent topic: Relational Views over XML Data
9.2 Creating a Relational View over XML: One Row for Each XML Document
To expose each document in an XMLType table as a row in a relational view, use CREATE OR REPLACE VIEW AS SELECT, selecting from a join of the XMLType table and a relational table that you create from the XML data using SQL/XML function XMLTable.
You use standard SQL/XML function XMLTable to map nodes in the XML document to columns in the view. Use this technique whenever there is a one-to-one (1:1) relationship between documents in the XMLType table and the rows in the view.
Example 9-1 creates relational view purchaseorder_master_view, which has one row for each row in XMLType table po_binaryxml.
Example 9-1 Creating a Relational View of XML Content
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)
Parent topic: Relational Views over XML Data
9.3 Creating a Relational View over XML: Mapping XML Nodes to Columns
To expose data from multiple levels of an XMLType table as individual rows in a relational view, apply SQL/XML function XMLTable to each level. Use this technique whenever there is a one-to-many (1:N) relationship between documents in the XMLType table and rows in the view.
That is, you use the same general approach as for breaking up a single level (see Creating a Relational View over XML: One Row for Each XML Document): Define the columns making up the view, and map the XML nodes to those columns. But in this case you apply XMLTable to each document level that is to be broken up and stored in relational columns.
For example, each PurchaseOrder element contains a LineItems element, which in turn contains one or more LineItem elements. Each LineItem element has child elements, such as Description, and an ItemNumber attribute. To make such lower-level data accessible as a relational value, use XMLTable to project both the PurchaseOrder element and the LineItem collection.
When element PurchaseOrder is broken up, its descendant LineItem element is mapped to a column of type XMLType, which contains an XML fragment. That column is then passed to a second call to XMLTable to be broken into its various parts as multiple columns of relational values.
Example 9-2 illustrates this. It uses XMLTable to effect a one-to-many (1:N) relationship between the documents in XMLType table po_binaryxml and the rows in relational view purchaseorder_detail_view. The view provides access to the individual members of a collection and exposes the collection members as a set of rows.
In Example 9-2, there is one row in view purchaseorder_detail_view for each LineItem element in the XML documents stored in XMLType table po_binaryxml.
The CREATE OR REPLACE VIEW statement of Example 9-2 defines the set of relational columns that make up the view. The SELECT statement passes table po_binaryxml as context to function XMLTable to create virtual table p, which has columns reference and lineitem. These columns contain the Reference and LineItem elements of the purchase-order documents, respectively.
Column lineitem contains a collection of LineItem elements as an XMLType instance — one row for each element. These rows are in turn passed to a second XMLTable expression to serve as its context. This second XMLTable expression creates a virtual table of line-item rows, with columns corresponding to various descendant nodes of element LineItem. Most of these descendants are attributes (ItemNumber, Part/@Id, and so on). One of the descendants is the child element Description.
Element Reference is projected in view purchaseorder_detail_view as column reference. It provides a foreign key that can be used to join rows in view purchaseorder_detail_view to corresponding rows in view purchaseorder_master_view. The correlated join in the CREATE OR REPLACE VIEW statement ensures that the one-to-many (1:N) relationship between element Reference and the associated LineItem elements is maintained whenever the view is accessed.
Example 9-2 Accessing Individual Members of a Collection Using a View
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)
Parent topic: Relational Views over XML Data
9.4 Indexing Binary XML Data Exposed Using a Relational View
If the relational columns of the structured component of an XMLIndex index over binary XML data match the columns of a relational view over that data, then the view too is effectively indexed.
When the XMLType data that is exposed in a relational view is stored as binary XML, you can typically improve performance by creating an XMLIndex index that has a structured component that matches the view columns. Such an index projects parts of the XML data onto relational columns, just as the view does. When the columns of the index match the columns of the view, the view is itself indexed.
To simplify the creation of such an XMLIndex index, you can PL/SQL function DBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView to provide exactly the XMLTable expression needed for creating the index. That is the sole purpose of this function: to return an XMLTable expression that you can use to create an XMLIndex index for a relational view. It takes the view as argument and returns a CLOB instance. Example 9-3 illustrates this.
Example 9-4 shows the XMLTable expression used in Example 9-3.
See Also:
Oracle Database PL/SQL Packages and Types Reference for information about PL/SQL function DBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView
Example 9-3 XMLIndex Index that Matches Relational View Columns
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');
Example 9-4 XMLTable Expression Returned by PL/SQL Function getSIDXDefFromView
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'Related Topics
Parent topic: Relational Views over XML Data
9.5 Querying XML Content As Relational Data
Examples here show relational queries of XML data. They illustrate some of the benefits provided by creating relational views over XMLType tables and columns.
Example 9-5 and Example 9-6 show how to query master and detail relational views of XML data. Example 9-5 queries the master view to select the rows where column userid starts with S.
Example 9-6 joins the master view and the detail view. It selects the purchaseorder_detail_view rows where the value of column itemno is 1 and the corresponding purchaseorder_master_view row contains a userid column with the value SBELL.
Example 9-7 shows how to use relational views over XML content to perform business-intelligence queries on XML documents. The example query selects PurchaseOrder documents that contain orders for titles identified by UPC codes 715515009058 and 715515009126.
The query in Example 9-7 determines the number of copies of each film title that are ordered in each PurchaseOrder document. For example, for part number 715515009126, there are four PurchaseOrder documents where one copy of the item is ordered and seven PurchaseOrder documents where three copies of the item are ordered.
Example 9-5 Querying Master Relational View of XML Data
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.
Example 9-6 Querying Master and Detail Relational Views of XML Data
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.
Example 9-7 Business-Intelligence Query of XML Data Using a View
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.
Parent topic: Relational Views over XML Data
Footnote Legend
Footnote 1:The view-name argument to getSIDXDefFromView must be uppercase, because that is how the name is recorded.