Matakuliah Tahun : T0413 : 2009 Pure XML Pertemuan 10 XML: The foundation of SOA and Web 2.0 SOA Web 2.0 XML Database DB2 9 Bina Nusantara University 3 What is DB2’s pureXML technology? <employee id=“9”> <name>John</name> <phone> 555 1212</phone> </employee> XQuery SQL id name 9 John phone employee 5551212 id=901 name John Relational Engine Bina Nusantara University phone 555-1212 XML Engine 4 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 Bina Nusantara University 5 Native XML Storage • XML stored in parsed hierarchical format create table dept (deptID char(8),…, deptdoc xml); • Relational columns are stored in relational format (tables) • XML columns are stored natively • XML stored in UTF8 Bina Nusantara University 6 Integration: Relational and hierarchical data PATIENTS table NAME SEX AGE Elizabeth F 65 COFFEE SMOKE 35 DNA 15 geneX = 987 Raul M 47 10 0 geneX = 987 … Tina F 58 4 10 geneX = 123 Bina Nusantara University 7 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 ; Bina Nusantara University 8 pureXML: No need to remap for Data Exchange Company Data Company Data Edge Relational And XML DB Applications XML Processing Edge Applications XML Exchange Formats: XML Web Services Processing Syndication Industry Formats Relational And XML DB 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 Bina Nusantara University 9 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 ); Bina Nusantara University 10 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); Bina Nusantara University 11 XPath / /dept /dept/employee /dept/employee/@id /dept/employee/name /dept/employee/phone /dept/employee/office (...) 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> employee </dept> id=901 Bina Nusantara University name John Doe phone 408-555-1212 Each node has a path dept employee office 344 id=902 name Peter Pan phone 408-555-9918 office 216 12 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 Result /dept/@bldg 101 /dept/employee/@id 901 902 /dept/employee/name <name>Peter Pan</name> <name>John Doe</name> /dept/employee/name/text() Peter Pan John Doe Bina Nusantara University 13 <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 Result /dept/employee/*/text() John Doe 408 555 1212 344 Peter Pan 408 555 9918 216 /dept/*/@id 901 902 //name/text() Peter Pan John Doe Bina Nusantara University /dept//phone <phone>408 555 1212</phone> <phone>408 555 9918</phone> 14 XPath:Predicates 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 Result /dept/employee[@id=“902”]/name <name>Peter Pan</name> /dept[@bldg=“101”]/employee[office >“300”]/name <name>John Doe</name> //employee[office=“344” OR office=“216”]/@id 901 902 /dept/employee[2]/@id 902 Bina Nusantara University 15 <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 Parent context: “.” context: “..” XPath Result /dept/employee/name[../@id=“902”] <name>Peter Pan</name> /dept/employee/office[.>“300”] <office>344</office> /dept/employee[office > “300”]/office <office>344</office> /dept/employee[name=“John Doe”]/../@bldg 101 /dept/employee/name[.=“John Doe”]/../../@bldg 101 Bina Nusantara University 16 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 Bina Nusantara University 17 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 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> Bina Nusantara University Input: <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> 18 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[z ip="95116"]' Bina Nusantara University passing CLIENTS.CONTACT as "c") select name from clients where xmlexists('$CONTACT/Client/Add ress[zip="95116"]') 19 Case sensitivity - Caution! SQL is not case sensitive XPath 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"]') Bina Nusantara University 20 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: xquery db2-fn:xmlcolumn(‘CLIENTS.CONTACT’)/Client/Address[zip=“95116”] It is typical to see this problem when copy/pasting from a Word or Powerpoint document Bina Nusantara University 21 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' Bina Nusantara University 22 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 Bina Nusantara University 23 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 XML XMLELEMENT function Bina Nusantara University XMLTABLE function Relational 24 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> Bina Nusantara University 25 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> Bina Nusantara University 26 Sample HTML Bina Nusantara University <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> 27 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> ) Bina Nusantara University 28 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)) Bina Nusantara University 29 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 Bina Nusantara University 30 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; Bina Nusantara University 31 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; Bina Nusantara University 32 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 index idx3 on customer(info) generate key using xmlpattern '//name' as sql varchar(40); Bina Nusantara University create table customer( info XML); <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> 33 XML Indexing Examples create table customer( info XML); Don’t index everything! Too expensive for insert, update, delete ! create index idx4 on customer(info) generate key using xmlpattern '//text()' as sql varchar(40); Bina Nusantara University <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> 34 </customerinfo> 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 Bina Nusantara University 35 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) No Schema One Schema Schema V1 & Schema V2 Documents w/ and w/o schema Bina Nusantara University (e) Any mix you want! Most databases only support (a) and (b). DB2 9 allows (a) through (e). 36