XML in Oracle
XML in Oracle
XML In Oracle
Lewis R Cunningham Database Architect Sheperd Systems An Expert's Guide to Oracle http://blogs.ittoolbox.com/oracle/guide
An expert is a person who has made all the mistakes that can be made in a very narrow field. - Niels Bohr (1885 - 1962)
Topics
A little background XDK XSU XSQL XDB XPath XMLType SQLX XSLT XQuery
Beta XDK in 8i for Java, C and PL/SQL Migrated to XDK in 9i Migration to SQLX XMLTypes and XDB (With WebDAV)
XML is like violence If it doesn't solve the problem, you aren't using enough of it.
XDK
Java C PL/SQL (Deprecated in favor of XDB APIs) DOM SAX JAXB XPath
XDK Example
create or replace procedure domsample(dir varchar2, inpfile varchar2, errfile varchar2) is p xmlparser.parser; doc xmldom.DOMDocument; begin -- new parser p := xmlparser.newParser; -- set some characteristics xmlparser.setValidationMode(p, FALSE); xmlparser.setErrorLog(p, dir || '/' || errfile); xmlparser.setBaseDir(p, dir); -- parse input file xmlparser.parse(p, dir || '/' || inpfile); -- get document doc := xmlparser.getDocument(p);
XSU
declare queryCtx DBMS_XMLQuery.ctxType; result CLOB; begin -- set the query context. queryCtx := DBMS_XMLQuery.newContext('select * from employees'); DBMS_XMLQuery.setRowTag(queryCtx,'EMP'); -- sets the row tag name DBMS_XMLQuery.setRowSetTag(queryCtx,'EMPSET'); -- sets rowset tag name result := DBMS_XMLQuery.getXML(queryCtx); printClobOut(result); -- print the result..! DBMS_XMLQuery.closeContext(queryCtx); end; -- get the result -- close the query handle;
XSQL
Template Driven, Dynamic Web Pages Combines XML, XSLT, SQL and HTTP Hides XDK and XSU Handles Select, Insert, Delete and Update Can be very simple or very sophisticated
XSQL Example
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="FlightList.xsl"?> <xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql"> SELECT Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') Due FROM FlightSchedule WHERE TRUNC(ArrivalTime) = TRUNC(SYSDATE) AND Destination = ? ORDER BY ExpectedTime </xsql:query>
XPath
XPath is how you address a part of XML <data><addr1>123 abc st</addr1><city>New Orleans</city></data> The city element is accessed by /data/city The value of city is accessed by /data/city/text() XPath is a huge, robust language With XPath, you can access siblings, children, parents, etc I'll be showing examples of XPath
XDB
Native XML support for highly performant XML storage and retrieval XML operations on SQL data XML shredding FTP, HTTP(s), WebDAV XML Repository (file/folder paradigm) XMLType is the key XML Tables and Views XDB supersedes the older XDK PL/SQL APIs
XMLType
A true SQL type, can be used as a table type, column type and can be used in PL/SQL Built-in methods and supporting APIs XMLType elements can be indexed! XPath access Built-in XSLT Stored as CLOBs or Shredded, you chose Optimized by Oracle This is the key to XML in the database going forward
SQLX
SQLX is more properly called SQL/XML Oracle supports all of the INCITS SQL/XML:2005 standard SQLX is a set based way of creating and accessing XML data SQLX is the way to add XML to your queries SQLX adds about 15 new functions to SQL
SQLX Functions
SQLX adds: XMLAGG, XMLCDATA, XMLCOLATTVAL, XMLCOMMENT, XMLCONCAT, XMLELEMENT, XMLFOREST, XMLPARSE, XMLPI, XMLQUERY, XMLROOT, XMLSEQUENCE, XMLSERIALIZE, XMLTABLE, XMLTRANSFORM
XSLT
XSLT is the eXtensible Stylesheet Language for Transformation XSLT uses XPath to access XML and a scripting language to transform that XML into other forms of XML An example would be to transform an XML document into an xHTML page XSLT is supported by XMLType, the XDK and XQuery
XQuery
XQuery is a non-relational, functional language designed to query XML data Like SQL, PL/SQL or Java, XQuery is a language XQuery uses XPath to address data XQuery can be used to replace XSLT SQLX functions XMLTable and XMLQuery combine the power of SQL and XQuery I have yet to find a use for it
XQuery Example
SELECT XMLQuery( 'for $e in doc("/public/emps.xml")/emps/emp let $d := doc("/public/depts.xml")//dept[@deptno = $e/@deptno]/@dname where $e/@salary > 100000 order by $e/@empno return <emp ename="{$e/@ename}" dept="{$d}"/>' RETURNING CONTENT) xml_data FROM DUAL; XML_DATA -------------------------------------------------------------------------------<emp ename="Jack" dept="Administration" /> <emp ename="Jill" dept="Marketing" />
The language that describes XML Replaces the DTD Or learn Relax NG It all gets easier if you understand XPath
Learn XPath
Thank you!
Lewis R Cunningham Database Architect Sheperd Systems An Expert's Guide to Oracle http://blogs.ittoolbox.com/oracle/guide
Sometimes a rather thin, syntax-oriented, semantically vacuous layer of commonality is all that is needed to simplify things dramatically. C. M. Sperberg-Mcqueen