360 likes | 472 Views
Pure XML Pertemuan 10. Matakuliah : T0413 Tahun : 2009. XML: The foundation of SOA and Web 2.0. SOA. Web 2.0. XML. Database DB2 9. <employee id=“ 9 ”> <name> John </name> <phone> 555 1212 </phone> </employee>. XQuery. SQL. id. name. phone. 9. John. 5551212.
E N D
Pure XMLPertemuan 10 Matakuliah : T0413 Tahun : 2009
XML: The foundation of SOA and Web 2.0 SOA Web 2.0 XML Database DB2 9
<employee id=“9”> <name>John</name> <phone> 555 1212</phone> </employee> XQuery SQL id name phone 9 John 5551212 employee XML Engine Relational Engine id=901 name phone John 555-1212 What is DB2’s pureXML technology?
What is DB2’s pureXML technology? • Two main characteristics: • XML is stored in parsed-hierarchical format in the database • DB2 has a native XML interface to the engine • The storage format = the processing format
Native XML Storage • XML stored in parsed hierarchical format create table dept (deptID char(8),…, deptdoc xml); • Relational columnsare stored in relationalformat (tables) • XML columns arestored natively • XML stored in UTF8
Integration: Relational and hierarchical data PATIENTS table geneX = 987 geneX = 987 geneX = 123
SQL with Xquery/XPath SELECT name from PATIENTS WHERE xmlexists('$p/Patient/MedicalDetail[geneX="987"]' passing PATIENTS.DNA as "p") and sex = 'F' and age > 55 and coffee > 15 and smoke > 10 ;
pureXML: No need to remap for DataExchange Company Data Company Data Edge Edge Relational And XML DB Relational And XML DB Applications Applications XML Processing XML Processing • XML Exchange Formats: • Web Services • Syndication • Industry Formats • Storing and querying XML without needing to re-map exchange data to relational format • Providing common integrity, recovery, security, management interfaces and mechanisms • Providing flexibility in the face of schema evolution • Supporting easy access through Web Services and Web 2.0
Table definitions with XML columns create table items ( id int primary key not null, brandname varchar(30), itemname varchar(30), sku int, srp decimal(7,2), comments xml ); create table clients( id int primary key not null, name varchar(50), status varchar(10), contact xml );
Insert & Import of XML data INSERT INTO clients VALUES (77, 'John Smith', 'Gold', '<addr>111 Main St., Dallas, TX, 00112</addr>') ; IMPORT from "C:\DB2workshop\Quicklabs\quicklab14a\clients.del" of del xml from "C:\DB2workshop\Quicklabs\quicklab14a" INSERT INTO CLIENTS (ID, NAME, STATUS, CONTACT); IMPORT from "C:\DB2workshop\Quicklabs\quicklab14a\items.del" of del xml from "C:\DB2workshop\Quicklabs\quicklab14a" INSERT INTO ITEMS (ID, BRANDNAME, ITEMNAME, SKU, SRP, COMMENTS);
/ /dept /dept/employee /dept/employee/@id /dept/employee/name dept /dept/employee/phone /dept/employee/office (...) employee employee id=901 name phone office id=902 name phone office John Doe 408-555-1212 344 Peter Pan 408-555-9918 216 XPath • XML Query Language • Subset of XQuery & SQL/XML • <dept bldg=“101”> • <employee id=“901”> • <name>John Doe</name> • <phone>408 555 1212</phone> • <office>344</office> • </employee> • <employee id=“902”> • <name>Peter Pan</name> • <phone>408 555 9918</phone> • <office>216</office> • </employee> • </dept> Each node has a path
<dept bldg=“101”> • <employee id=“901”> • <name>John Doe</name> • <phone>408 555 1212</phone> • <office>344</office> • </employee> • <employee id=“902”> • <name>Peter Pan</name> • <phone>408 555 9918</phone> • <office>216</office> • </employee> • </dept> XPath: Simple XPath Expressions • Use fully qualified paths to specify elements/attributes • “@” is used to specify an attribute • use “text()” to specify the text node under an element
<dept bldg=“101”> • <employee id=“901”> • <name>John Doe</name> • <phone>408 555 1212</phone> • <office>344</office> • </employee> • <employee id=“902”> • <name>Peter Pan</name> • <phone>408 555 9918</phone> • <office>216</office> • </employee> • </dept> XPath: Wildcards • * matches any tag name • // is the “descendent-or-self” wildcard
XPath:Predicates • <dept bldg=“101”> • <employee id=“901”> • <name>John Doe</name> • <phone>408 555 1212</phone> • <office>344</office> • </employee> • <employee id=“902”> • <name>Peter Pan</name> • <phone>408 555 9918</phone> • <office>216</office> • </employee> • </dept> • Predicates are enclosed in square brackets […] • Can have multiple predicates in one XPath • Positional predicates: [n] selects the n-th child
<dept bldg=“101”> • <employee id=“901”> • <name>John Doe</name> • <phone>408 555 1212</phone> • <office>344</office> • </employee> • <employee id=“902”> • <name>Peter Pan</name> • <phone>408 555 9918</phone> • <office>216</office> • </employee> • </dept> XPath: The Parent Axis • Current context: “.” • Parent context: “..”
XQuery • XQuery supports path expressions to navigate XML hierarchical structure • XQuery supports both typed and untyped data • XQuery lacks null values because XML documents omit missing or unknown data • XQuery returns sequences of XML data
XQuery: The FLWOR Expression • FOR: iterates through a sequence, bind variable to items • LET: binds a variable to a sequence • WHERE: eliminates items of the iteration • ORDER: reorders items of the iteration • RETURN: constructs query results Input: • create table dept(deptID char(8),deptdoc xml); • xquery • for $d in db2-fn:xmlcolumn(‘DEPT.DEPTDOC')/dept • let $emp := $d//employee/name • where $d/@bldg > 95 • order by $d/@bldg • return • <EmpList> • {$d/@bldg, $emp} • </EmpList> • <dept bldg=“101”> • <employee id=“901”> • <name>John Doe</name> • <phone>408 555 1212</phone> • <office>344</office> • </employee> • <employee id=“902”> • <name>Peter Pan</name> • <phone>408 555 9918</phone> • <office>216</office> • </employee> • </dept>
SQL/XML queries • SQL/XML is designed to bridge between the SQL and XML worlds. • Part of the SQL standard includes specifications for embedding XQuery or XPath expressions within SQL statements • XPATH is a language for navigating XML documents to find elements or attributes • XQuery includes support for XPATH xmlexists function • Restricts results based on an XML element value • Syntax required prior to DB2 9.5: • New syntax allowed with DB2 9.5: select name from clients where xmlexists('$c/Client/Address[zip="95116"]' passing CLIENTS.CONTACT as "c") select name from clients where xmlexists('$CONTACT/Client/Address[zip="95116"]')
Case sensitivity - Caution! SQL is not case sensitiveXPath and XQuery are case sensitive!DB2 objects (tables/columns) need to be put in upper case.Example: select name from clients where xmlexists('$contact/Client/Address[zip="95116"]') select name from clients where xmlexists('$CONTACT/Client/Address[zip="95116"]')
Curly quotes - Caution! SQL, XPath and XQuery use straight quotes (for either single or double quotes depending the situation)Examples: ‘The quotes in this example are curly, which is bad!’ 'The quotes in this example are straight, which is good!'The example below uses curly quotes, so it will fail:It is typical to see this problem when copy/pasting from a Word or Powerpoint document xquery db2-fn:xmlcolumn(‘CLIENTS.CONTACT’)/Client/Address[zip=“95116”]
xmlquery function • Retrieve one or more element values from our XML document select xmlquery('$CONTACT/Client/email') from clients where status = 'Gold' Retrieving XML data using “for” and “return” clauses of XQuery SELECT name, xmlquery ('for $e in $CONTACT/Client/email[1] return $e') FROM clients WHERE status = 'Gold'
Retrieving and transforming XML into HTML SELECT xmlquery('for $e in $CONTACT/Client/email[1]/text() return <p>{$e}</p>') FROM clients WHERE status = 'Gold' xmltable function: From XML to Relational select t.comment#,i.itemname,t.customerID,Message from items i, xmltable('$COMMENTS/Comments/Comment' columns Comment# integer path 'CommentID', CustomerID integer path 'CustomerID', Message varchar(100) path 'Message') as t
XML XMLELEMENT function XMLTABLE function Relational xmlelement function: From Relational to XML select xmlelement (name "item",itemname), xmlelement (name "id", id), xmlelement (name "brand",brandname), xmlelement (name "sku",sku) from items where srp < 100 Review: XMLTABLE vs XMLELEMENT
Simple XQuery to return customer contact data xquery db2-fn:xmlcolumn('CLIENTS.CONTACT') • db2-fn:xmlcolumn is a function with a parameter that identifies the table name and column name of an XML column. FLWOR expression to retrieve client fax data xquery for $y in db2-fn:xmlcolumn('CLIENTS.CONTACT')/Client/fax return $y <fax>4081112222</fax> <fax>5559998888</fax>
Path expression with additional filtering predicate xquery db2-fn:xmlcolumn('CLIENTS.CONTACT')/Client/Address[zip="95116"] Querying DB2 XML data and returning results as HTML xquery <ul> { for $y in db2-fn:xmlcolumn('CLIENTS.CONTACT')/Client/Address order by $y/zip return <li>{$y}</li> }</ul>
Sample HTML <ul> <li> <address> <street>9407 Los Gatos Blvd.</street> <city>Los Gatos</city> <state>ca</state> <zip>95302</zip> </address> </li> <Address> <street>4209 El Camino Real</street> <city>Mountain View</city> <state>CA</state> <zip>95302</zip> </address> </li> … </ul>
Embedded SQL within XQuery • db2-fn:sqlquery • A function which executes an SQL query and returns only the selected data • The SQL Query passed to db2-fn:sqlquery must return XML data • This XML data can then be further processed by XQuery xquery for $y in db2-fn:sqlquery('select comments from items where srp > 100')/Comments/Comment where $y/ResponseRequested='Yes' return ( <action> {$y//ProductID} {$y//CustomerID} {$y//Message} </action> )
Joins with SQL/XML create table dept (unitID char(8), deptdoc xml) create table unit (unitID char(8) primary key not null, name char(20), manager varchar(20), ... ) select u.unitID from dept d, unit u where XMLEXISTS ('$e//employee[name = $m] ' passing d.deptdoc as "e", u.manager as "m") select u.unitID from dept d, unit u where u.manager = XMLCAST(XMLQUERY('$e//employee/name' passing d.deptdoc as "e") as char(20))
DELETE operations • DELETE a row based on a condition that uses an XML element • Simply use an SQL DELETE statements • A DELETE first searches for the document, and then deletes it. The search part can be done using the same SQL/XML functions as when querying data UPDATE operations • With DB2 9, use: • SQL UPDATE statement • or Stored Procedure • DB2XMLFUNCTIONS.XMLUPDATE • With DB2 9.5: • Use the TRANSFORM expression
Update Example with DB2 9.5: TRANSFORM expression Adding an element to the end UPDATE purchaseorder SET porder = xmlquery('transform copy $po := $order modify do insert document { <item> <partid>100-103-01</partid> <name>Snow Shovel, Super Deluxe 26 inch</name> <quantity>4</quantity> <price>49.99</price> </item> } into $po/PurchaseOrder return $po' passing purchaseorder.porder as "order") where poid=5012;
Update Example with DB2 9.5: TRANSFORM expression Deleting an element UPDATE purchaseorder SET porder = xmlquery('transform copy $po := $order modify do delete $po/PurchaseOrder/item[partid = ''100-201-01''] return $po' passing porder as "order") WHERE poid=5012;
XML Indexing Examples create unique index idx1 on customer(info) generate key using xmlpattern '/customerinfo/@Cid' as sql double; create index idx2 on customer(info) generate key using xmlpattern '/customerinfo/name' as sql varchar(40); create tablecustomer(infoXML); <customerinfo Cid="1004"> <name>Matt Foreman</name> <addr country="Canada"> <street>1596 Baseline</street> <city>Toronto</city> <state>Ontario</state> <pcode>M3Z-5H9</pcode> </addr> <phone type="work">905-555-4789</phone> <phone type="home">416-555-3376</phone> <assistant> <name>Peter Smith</name> <phone type="home">416-555-3426</phone> </assistant> </customerinfo> create indexidx3oncustomer(info) generate key using xmlpattern '//name' as sql varchar(40);
<customerinfo Cid="1004"> <name>Matt Foreman</name> <addr country="Canada"> <street>1596 Baseline</street> <city>Toronto</city> <state>Ontario</state> <pcode>M3Z-5H9</pcode> </addr> <phone type="work">905-555-4789</phone> <phone type="home">416-555-3376</phone> <assistant> <name>Peter Smith</name> <phone type="home">416-555-3426</phone> </assistant> </customerinfo> create indexidx4oncustomer(info) generate key using xmlpattern '//text()' as sql varchar(40); XML Indexing Examples create tablecustomer(infoXML); Don’t index everything! Too expensive for insert, update, delete !
XML Schema Support • XML Schemas are supported using “XML Schema repositories” • To validate based on an XML Schema you can: • Use the XMLVALIDATE function during an INSERT • Use a BEFORE Trigger • To test if an XML document has been validated, you can use the “IS VALIDATED” predicate on a CHECK constraint
What does an XML Schema do? DB2 pureXML Schema Flexibility Document validation for zero, one, or many schemas per XML column: Always Well Formed XML (a) (b) (c) (d) (e) No Schema One Schema Schema V1 Documents Any mix you want! & Schema V2 w/ and w/o schema Most databases only support (a) and (b). DB2 9 allows (a) through (e).