XML QUERY (XQUERY) SUPPORT IN ORACLE DATABASE 10G RELEASE 2
- 格式:pdf
- 大小:144.66 KB
- 文档页数:3
*The Natural Science Foundation of Beijing of China under Grant No. 4082003 (北京市自然科学基金). Received 2010-05, Accepted 2010-07.ISSN 1673-9418 CODEN JKYTA8 E-mail: fcst@ Journal of Frontiers of Computer Science and Technology 1673-9418/2010/04(11)-0996-09 Tel: +86-10-51616056DOI: 10.3778/j.issn.1673-9418.2010.11.004支持XML 查询代数和树模式查询的XQuery 系统框架*张晓博+, 廖湖声北京工业大学 计算机学院, 北京100124A Framework for XQuery System with XML Algebra and Tree Pattern Query *ZHANG Xiaobo +, LIAO HushengCollege of Computer Science, Beijing University of Technology, Beijing 100124, China + Corresponding author: E-mail: jwilljacob@ZHANG Xiaobo, LIAO Husheng. A framework for XQuery system with XML algebra and tree pattern query. Journal of Frontiers of Computer Science and Technology, 2010, 4(11): 996-1004.Abstract: High-performance implementation of XQuery needs to use query optimization methods provided by XML query algebra, also needs to use efficient holistic twig matching algorithm. In order to combine these two XML query processing techniques in XQuery processing system, this paper proposes a general framework to sup-port XQuery high-performance implementation. In this framework, it provides an open date source connection, and supports to represent a variety of query algebra operators and twig algorithms by using a functional query plan de-scription language FXQL(functional XML query language) as an intermediate language; and can implement query rewritings based on each query algebra by using this intermediate program transformation and separate independent tree pattern calculation from query plan. Thus, it allows that two query processing techniques to smoothly integrate into the same system framework, and effectively supports XQuery language implementation in a variety of envi-ronments.Key words: XML query; XQuery language; framework; tree pattern摘 要: XQuery 语言的高性能实现需要利用XML 查询代数提供的查询优化方法, 也需要采取高效的树模式整体匹配算法。
XML在Oracle数据库中的应用2007年10月20日目录第1章Oracle数据库对XML的支持 (3)1.1. 支持XML的数据库版本 (3)1.2. 什么时候需要XDB数据库属性 (3)1.3. 哪些版本支持XQuery (4)第2章在Oracle中如何存储XML数据 (4)2.1. 以关系型存储XML数据(结构化的存储) (4)2.2. 以XMLTYPE的方式存储 (6)2.2.1. 非结构化存储 (6)2.2.2. 结构化存储 (26)第1章Oracle数据库对XML的支持并不是所有的Oracle数据库版本都支持XML的存储以及操作,这里列出了Oracle数据库对XML的支持功能1.1.支持XML的数据库版本Oracle最开始提供XDB性质是在Oracle9.2.0.1这个数据库版本,但是直到9.2.0.3版本才最低限度的提供了XDB托管的级别。
查询安装好的数据库是否已经具备了XDB的性质,需要查询Oracle的字典表:DBA_REGISTRY,例如:代码1-1查询当前数据库的安装组件SELECT * FROM DBA_REGISTRY;运行的结果如下:图1-1查询DBA_REGISTRY字典的结果只有在状态列STATUS的数值为VALID的情况下,XDB数据才是安装成功的。
1.2.什么时候需要XDB数据库属性当在数据库的PROCEDURE、VIEW、FUNCTIONS、COLUMNS或者TABLES中使用了XMLTYPE这个属性,就会需要XDB数据库的来作支撑。
同样如果在数据库中使用了DBMS_XMLDOM、DBMS_XMLQUERY等系统包,也是需要有XDB的支持。
1.3.哪些版本支持XQueryOracle数据库中支持XQuery标准的最低版本是10.2.0.1。
第2章在Oracle中如何存储XML数据在Oracle数据库中存储XML的数据一共有两种方法:数据还是以传统的关系型的存储在数据库中;以XMLTYPE的方式存储在数据库表中;2.1.以关系型存储XML数据(结构化的存储)第一种方法是沿用Oracle的传统模式将数据以字符串的类型存储在数据库的varchar列中,调用函数来返回XML类型的数据,例如:代码2-1使用传统关系型的存储方式存储数据/*以HR.EMPLOYEES表格数据为案例*/--对表格数据的扫描结果如下SQL> set timing onSQL>SELECT first_name||'.'||last_name FROM HR.EMPLOYEES;FIRST_NAME||'.'||LAST_NAME----------------------------------------------Hermann.BaerShelley.HigginsWilliam.Gietz……Executed in 0.08 seconds--使用XMLELEMENT函数来进行转换,选择结果10行以内的数据,运行结果如下SQL > SELECT XMLElement("name",first_name||'.'||last_name) FROM hr.employees where rownum<10;XMLElement("name",first_name||'.'||last_name)--------------------------------------------------------------------------------<name>Ellen.Abel</name><Object><name>Mozhe.Atkinson</name><Object><name>Hermann.Baer</name><Object><name>Amit.Banda</name><Object><name>Sarah.Bell</name>9 rows selectedExecuted in 8.212 seconds在对全表数据扫描时,还出现了如下错误尚未找到合理原因:代码2-2使用Xmlement对表格数据进行全部扫描SQL> select count(*) from hr.employees;COUNT(*)----------107Executed in 0.02 secondsSQL> SELECT XMLElement("name",first_name||'.'||last_name) FROM hr.employees;XMLELEMENT("NAME",FIRST_NAME||--------------------------------------------------------------------------------<name>Ellen.Abel</name><Object><name>Mozhe.Atkinson</name><Object><name>Hermann.Baer</name><Object><name>Amit.Banda</name><Object><name>Sarah.Bell</name>…………<Object><Object><Object><Object><Object>SELECT XMLElement("name",first_name||'.'||last_name) FROM hr.employeesORA-03114: 未连接到ORALCE结论:优点——可以沿用传统的关系型数据库模式来存储,使用B树索引加快查询、修改、删除的速度;便于查询、修改、存储的优化;DML操作技术比较成熟,使用方便、易懂。
将XML文件导入到Oracle数据库中的思路一、程序源码前台代码:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ImportData.aspx.cs" Inherits="ImportData" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>将Xml文件导入到数据库</title></head><body><form id="form1" runat="server"><div><TABLE id="Table1" cellSpacing="3" cellPadding="3" bgColor="#99ccff" border="0"><TR><TD align="center" colSpan="2"><STRONG><FONT size="6">读取Xml,导入Oracle并显示</FONT></STRONG></TD></TR><TR><TD colSpan="2"><FONT size="2">读取Xml文件中的内容,并将其内容导入到Oracle数据库</FONT></TD></TR><TR><TD bgColor="#cccccc" style="width: 129px; height:27px;"><FONT size="2"><strong>请输入Xml文件名</strong></FONT></TD><TD bgColor="#cccccc" style="height: 27px"><asp:TextBox ID="textBoxXml" runat="server"Font-Names="Arial" Font-Size="X-Small"Width="500px"></asp:TextBox></TD></TR><TR><TD colSpan="2" style="height: 18px"><asp:Label id="Message" runat="server" Font-Bold="True" Font-Size="X-Small" ForeColor="Red"></asp:Label></TD></TR><TR><TD style="width: 129px; height: 17px"></TD><TD style="height: 17px"><asp:Button id="buttonSubmit" runat="server"Text="Submit" OnClick="buttonSubmit_Click"></asp:Button></TD></TR></TABLE><br /><strong><span style="color: #0066ff">测试从Xml文件是否能成功读取数据</span><br /><asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None"><FooterStyle BackColor="#990000" Font-Bold="True"ForeColor="White" /><RowStyle BackColor="#FFFBD6" ForeColor="#333333" /><SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" /><PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" /><HeaderStyle BackColor="#990000" Font-Bold="True"ForeColor="White" /><AlternatingRowStyle BackColor="White" /></asp:GridView></strong></div>后台代码:using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Data.OracleClient;using System.Data.OleDb;public partial class ImportData : System.Web.UI.Page{protected DataSet dataSetXml;protected DataTable dataTableXml;protected string tableName;protected string strConn =System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"] .ConnectionString;protected void Page_Load(object sender, EventArgs e){}protected void buttonSubmit_Click(object sender, EventArgs e){OracleConnection conn = new OracleConnection(strConn);conn.Open();Message.Text = "";dataSetXml = new DataSet();dataTableXml = new DataTable();try{dataSetXml.ReadXml(HttpContext.Current.Server.MapPath(textBoxXml.Te xt)); //装载XML文件到DataSetdataTableXml = dataSetXml.Tables[0]; //得到DataSet的第一个表tableName = textBoxXml.Text.Substring(0, textBoxXml.Text.Length - 4); //生成表名GridView1.DataSource = dataTableXml.DefaultView;GridView1.DataBind();}catch{Message.Text = "不能打开Xml文件或者是Xml文件格式错误";}if (dataTableXml.Rows.Count > 0) //检查是否有数据存在(ROWS){TableCheck(); //在数据库中建表TableInsert(); //添加XML数据到数据库}conn.Close();}#region 在数据库中建表private void TableCheck(){OracleConnection conn = new OracleConnection(strConn);try{conn.Open();int count = 0;DataTable schemaTable = conn.GetSchema("TABLES", new string[] { "SCOTT", tableName });string sqlCmd = "";if (schemaTable.Rows.Count == 1) //检查表是否存在,如果存在在DataTable 中将有一条记录// if (schemaTable.Rows.Count <1) 若这样写的话,程序运行无误,但只是导入了XML的表字段,没有导入数据{sqlCmd = "create table " + tableName + "(";// sqlCmd = "create table " + tableName + "(";for (int i = 0; i < dataTableXml.Columns.Count; i++){// 添加列text/string type 长度 100sqlCmd += dataTableXml.Columns[i].ColumnName.ToString() + " varchar2(100),";}sqlCmd = sqlCmd.Substring(0, sqlCmd.Length - 1) + ")";//删除最后一个“,”符号OracleCommand createcmd = new OracleCommand();createcmd.Connection = conn;mandText = sqlCmd;createcmd.ExecuteNonQuery();}}catch{Message.Text = "SQL命令或语句连接出问题";}finally{conn.Close();}}#endregion#region 添加XML数据到数据库private void TableInsert(){OracleConnection conn = new OracleConnection(strConn);try{conn.Open();// 遍历DataTable中的Rowsforeach (DataRow dr in dataTableXml.Rows){string sqlCmd = "Insert Into " + tableName + "(";// string sqlCmd = "Insert Into [ " + tableName + "] (";// 遍历Datatable的列for (int i = 0; i < dataTableXml.Columns.Count; i++){//添加列的字段名sqlCmd += dataTableXml.Columns[i].ColumnName.ToString() + ","; }sqlCmd = sqlCmd.Substring(0, sqlCmd.Length - 1) + ") Values(";// 遍历Datatable的列for (int i = 0; i < dataTableXml.Columns.Count; i++){//添加列值到rowsqlCmd += "'" + dr[i].ToString() + "',";}sqlCmd = sqlCmd.Substring(0, sqlCmd.Length - 1) + ")";OracleCommand cmd = new OracleCommand(sqlCmd, conn);cmd.ExecuteNonQuery();}Message.Text = "Xml文件中的数据成功加载到数据库中!";}catch{Message.Text = "在添加数据时产生了错误!";}finally{conn.Close();}}#endregion}二、XML文件导入oracle数据库思路(程序读解)1、将XML文件装载进DataSet,并得到第一个表,这个表就是我们要加入到数据库的DataTable;接下来,去除XML文件的扩展名,文件名字去掉扩展名将是我们数据库中使用的表名。
淮海工学院计算机工程学院实验报告书课程名: XML开发技术题目:基于XQuery实现XML文档的查询班级:学号:姓名:一.实验目的(1)通过实验,进一步掌握XQuery的语法与应用。
(2)通过实验,掌握对XML文档进行查询的方法与结果的输出形式。
(3)通过实验,进一步理解XQuery的作用及用法,能够正确写出对XML文档进行查询FLOWER语句,进一步理解其中自定义函数的定义与应用。
二.实验要求∙认真在编辑环境中编写XQuery文档;∙熟练掌握文档的调试和排错;∙熟练XQuery对XML文档的查询方式及结果输出方式;∙认真总结实验过程中出现的问题和实验结果。
∙认真编写实验报告,书写好的报告提交至/中相应课程的作业中。
三、实验内容1、查询Customer.xml文档中客户的姓名和电话,查询结果要求按照姓名排序,输出结果为XML文档。
<?xml version="1.0" encoding="UTF-8"?><Customers><Customer CustomerID="1"><Name>XiaoWang</Name><City>Beijing</City><Phone>135********</Phone></Customer><Customer CustomerID="2"><Name>XiaoLi</Name><City>Wuhan</City><Phone>135********</Phone></Customer><Customer CustomerID="3"><Name>Tom</Name><City>Olic</City><Phone>130********</Phone></Customer><Customer CustomerID="4"><Name>Jerry</Name><City>Donha</City><Phone>131********</Phone></Customer></Customers>2、(选做题)编写自定义函数,对存储在上题XML文档中的相关信息进行查询,要求查询出以下内容:(输出结果以HTML形式存储。
注册XMLSchema到ORACLEXDB并对XML进行验证注册XML Schema到Oracle XDB可以方便生成XML的验证。
What is an XML Schema?An XML Schema is a language for expressing constraints about XML documents. There are several different schema languages in widespread use, but the main ones are Document Type Definitions (DTDs), Relax-NG, Schematron and W3C XSD (XML Schema Definitions). From this page you can find out more about DTDs and W3C XSD, since those are the primary schema languages defined at W3C.the schema file ("shiporder.xsd"):[xhtml] view plain copy1.<?xml version="1.0" encoding="UTF-8" ?>2.<xs:schema xmlns:xs="/2001/XMLSchema">3.4.<xs:simpleType name="stringtype">5.<xs:restriction base="xs:string"/>6.</xs:simpleType>7.8.<xs:simpleType name="inttype">9.<xs:restriction base="xs:positiveInteger"/>10.</xs:simpleType>11.12.<xs:simpleType name="dectype">13.<xs:restriction base="xs:decimal"/>14.</xs:simpleType>15.16.<xs:simpleType name="orderidtype">17.<xs:restriction base="xs:string">18.<xs:pattern value="[0-9]{6}"/>19.</xs:restriction>20.</xs:simpleType>21.22.<xs:complexType name="shiptotype">23.<xs:sequence>24.<xs:element name="name" type="stringtype"/>25.<xs:element name="address" type="stringtype"/>26.<xs:element name="city" type="stringtype"/>27.<xs:element name="country" type="stringtype"/>28.</xs:sequence>29.</xs:complexType>30.31.<xs:complexType name="itemtype">32.<xs:sequence>33.<xs:element name="title" type="stringtype"/>34.<xs:element name="note" type="stringtype" minOccu rs="0"/>35.<xs:element name="quantity" type="inttype"/>36.<xs:element name="price" type="dectype"/>37.</xs:sequence>38.</xs:complexType>39.40.<xs:complexType name="shipordertype">41.<xs:sequence>42.<xs:element name="orderperson" type="stringtype"/ >43.<xs:element name="shipto" type="shiptotype"/>44.<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>45.</xs:sequence>46.<xs:attribute name="orderid" type="orderidtype" use ="required"/>47.</xs:complexType>48.49.<xs:element name="shiporder" type="shipordertype"/ >50.51.</xs:schema>解锁xdb帐号,在xdb下注册xsd:[c-sharp] view plain copy1.SQL> conn / as sysdba2.3.Connected as SYS4.5.SQL> alter user xdb account unlock identified by ******;6.er altered8.9.SQL> conn xdb/oracle;10.11.Connected as xdb使用DBMS_XMLSCHEMA.REGISTERSCHEMA注册xsd注册到xdb:[c-sharp] view plain copy1.SQL> begin2.dbms_xmlschema.registerschema(schemaurl => 'shipord er.xsd'3.,schemadoc => bfilename('XMLDIR', 'shiporder.xsd')4.,local => false5.,gentypes => true6.,genbean => false7.,gentables => false8.,force => false9.,owner => 'XDB');10.end;11./12.13.PL/SQL procedure successfully completed其中'XMLDIR'是ORACLE目录对象名,shiporder.xsd文件在这个目录下。
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程将已知格式xml文件中的数据导入Oracle数据库、把数据库中的数据导出成xml文件的过程。
已知格式xml文件如下:<?xml version="1.0"?><PEOPLE><PERSON PERSONID="E01"><NAME>Tony Blair</NAME><ADDRESS>10 Downing Street, London, UK</ADDRESS><TEL>(061) 98765</TEL><FAX>(061) 98768</FAX><EMAIL>blair@</EMAIL></PERSON><PERSON PERSONID="E02"><NAME>Bill Clinton</NAME><ADDRESS>White House, USA</ADDRESS><TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX><EMAIL>bill@</EMAIL></PERSON><PERSON PERSONID="E03"><NAME>Tom Cruise</NAME><ADDRESS>57 Jumbo Street, New York, USA</ADDRESS><TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX><EMAIL>cruise@</EMAIL></PERSON><PERSON PERSONID="E04"><NAME>Linda Goodman</NAME><ADDRESS>78 Crax Lane, London, UK</ADDRESS><TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX><EMAIL>linda@</EMAIL></PERSON></PEOPLE>于是写出过程如下:--建表CREATE TABLE PEOPLE(PERSONID VARCHAR2(10) PRIMARY KEY,NAME VARCHAR2(20),ADDRESS VARCHAR2(60),TEL VARCHAR2(20),FAX VARCHAR2(20),EMAIL VARCHAR2(40));--从xml文件载入数据保存到数据库的过程create or replace procedure xml2db(xmlfile varchar2) asp xmlparser.Parser;doc xmldom.DOMDocument;n xmldom.DOMNode;nl xmldom.DOMNodeList;len number;--根据PERSON结点生成插入SQL语句的过程function insertsql(node xmldom.DOMNode) return varchar2isn xmldom.DOMNode;nl xmldom.DOMNodeList;len number;nnm xmldom.DOMNamedNodeMap;isql varchar2(200);begin--取得PERSON结点所有属性nnm := xmldom.getAttributes(node);isql :='insert into people values(';isql := isql ||'''';--取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0));isql := isql ||'''';--取得PERSON结点下的所有结点,准备遍历nl := xmldom.getChildNodes(node);len := xmldom.getLength(nl);for i in0..len-1 loop--取出第i个结点n := xmldom.item(nl,i);isql := isql ||',';isql := isql ||'''';--将结点的文本值取出并拼接到SQL语句中isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n));isql := isql ||'''';end loop;isql := isql ||')';return isql;end insertsql;beginp := xmlparser.newParser;xmlparser.parse(p,xmlfile);--转换xml文件成DOM对像doc := xmlparser.getDocument(p);xmlparser.freeParser(p);--取出所有PERSON元素nl := xmldom.getElementsByTagName(doc,'PERSON');len := xmldom.getLength(nl);--清空people表的内容delete from people;for i in0..len-1 loop--取出第i个PERSON元素n := xmldom.item(nl,i);--执行插入该PERSON元素所用的SQL语句execute immediate insertsql(n);end loop;commit;xmldom.freeDocument(doc);end xml2db;/--将数据库中的数据导出成xml文件的过程create or replace procedure db2xml(xmlfile varchar2) asdoc xmldom.DOMDocument;ret xmldom.DOMNode;peoplenode xmldom.DOMNode;--遍历整个people表的游标Cursor cur_people is select*from people;--将people表中一行记录转换为元素--并插入到DOM文档对像根结点PEOPLE下的过程procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNod e,v_pid varchar2,v_name varchar2,v_addr varchar2,v_tel varchar2,v_fax varchar2,v_email varchar2)ispersonelem xmldom.DOMElement;personnode xmldom.DOMNode;itemelem xmldom.DOMElement;itemnode xmldom.DOMNode;text xmldom.DOMText;begin--创建PERSON结点personelem := xmldom.createElement(doc,'PERSON');--设置PERSONID属性xmldom.setAttribute(personelem,'PERSONID',v_pid);personnode := xmldom.appendChild(peoplenode,xmldom.makeNode(per sonelem));--向PERSON结点中添加NAME元素itemelem := xmldom.createElement(doc,'NAME');-- 将NAME结点添加到PERSON结点中itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemel em));-- 创建文本结点text := xmldom.createTextNode(doc,v_name);-- 将文本结点添加到NAME结点下,以构成完整NAME元素itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));--向PERSON结点中添加ADDRESS元素itemelem := xmldom.createElement(doc,'ADDRESS');itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemel em));text := xmldom.createTextNode(doc,v_addr);itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));--向PERSON结点中添加TEL元素itemelem := xmldom.createElement(doc,'TEL');itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemel em));text := xmldom.createTextNode(doc,v_tel);itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));--向PERSON结点中添加FAX元素itemelem := xmldom.createElement(doc,'FAX');itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemel em));text := xmldom.createTextNode(doc,v_fax);itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));--向PERSON结点中添加EMAIL元素itemelem := xmldom.createElement(doc,'EMAIL');itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemel em));text := xmldom.createTextNode(doc,v_email);itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));end addperson;begin--创建一个新DOM文档对像doc := xmldom.newDOMDocument;--为文档添加根结点PEOPLEpeoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode);--使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPL E根结点中for v_row in cur_people loopaddperson(doc,peoplenode,v_row.personid,v_,v_row.address,v_row.tel,v_row.fax,v_row.email);end loop;--将结果写入指定文件xmldom.writeToFile(doc,xmlfile);xmldom.freeDocument(doc);end db2xml;/。
Oracle中解析XMLType格式字段背景:项⽬从某数据交换平台获取XML数据,以Oracle的XMLType格式保存在数据库字段中,需要建⽴触发器、存储过程,在保存数据时解析XML字段,将数据写⼊其他业务表中。
参考资料:Oracle的XMLType操作⽂档,地址为要点总结:(⼀)使⽤SQL语句操作XMLType格式字段的3个主要⽅法 (1)existsNode(XMLType实例,XPATH表达式) 1.功能: 需要⽤在where条件中,通过XPATH表达式在传⼊的XMLType实例中进⾏查询,如果实例中有符合表达式的节点,则函数返回1,否则返回0 2.使⽤⽅法: select * from loginkcn_maritime_manifest where existsNode(xml,'/Root/Header/DocumentName')=1 andid='0272AB47DEDD450FBD06CA07463F245A'; 函数中的"xml"为保存XMLType数据的字段名,id为普通varchar2字段,此时existsNode作为where条件的⼀项来使⽤,可以筛选出表中的记录 (2)extract(XMLType实例,XPATH表达式) 1.功能: 需要⽤在select之后,from之前,⽤于对查询出的XMLType字段的值进⾏进⼀步提取,从⽽获得新的XMLType格式的结果 2.使⽤⽅法: select extract(xml,'/Root/Body/ContainerInfo') from loginkcn_maritime_manifest whereexistsNode(xml,'/Root/Header/DocumentName')=1 and id='0272AB47DEDD450FBD06CA07463F245A'; 在通过existsNode()⽅法筛选出记录的基础上,通过extract⽅法提取出Root节点下,Body⼦节点中所有ContainerInfo节点的信息,作为⼀个新的XMLType类型的结果值 3.注意: 如果在存储过程中,可以传⼊⼀个XMLType的变量,此时只需要使⽤select extract('传⼊的XMLType变量','XPATH表达式') into '提取出的XMLType变量' from dual;的形式,来将传⼊的变量进⼀步进⾏提取并保存到新的变量中。
达梦数据库的XQuery查询优化XML(eXtensible Markup Language可扩展标记语言)数据的自我描述性使其具有高度的结构化,良好的存储格式等特点,而且XML文档和HTML一样便于网络传输。
因此,XML被广泛应用而成为数据定义,数据交换和数据共享的主要标准。
目前XML 数据库主要研究的方向分为两大块,一是Native XML数据库系统,也称原生或纯XML数据库,如Tamino、Ipedo等;二是XML-enabled 数据库系统,即在已有的关系数据库系统或面向对象数据库系统的基础上扩充对XML的支持,这种数据库的优点在于可以充分利用已有的非常成熟的关系数据库技术。
在关系数据库系统上扩展对XML支持的一个重要部分就是实现XQuery查询。
达梦关公司的DM XML支持项目是以达梦关系数据库为平台,扩展了对XML的支持,研究和实现基于关系数据库XQuery查询优化技术,实现了高效的XQuery查询。
XQuery相关概念XQuery是XML的查询语言,XQuery与XML文档的关系相当与SQL与关系数据的关系。
与XQuery 紧密相关的一个概念是XPath,他们都是W3C的推荐规范。
XPath是XML文档的路径语言,用来在XML 文档中对文档数据进行寻址。
XQuery是XPath的扩展。
目前这两个规范的最新版本是XPath 2.0和XQuery 1.0,前者是后者的严格句法子集,并已成为推荐标准。
XPath表达式通过若干“路径步”在XML文档中进行定位(navigate)。
对于每一步(step),一个“轴”(axes)用来描述本步中的中间结果森林所包含文档节点(以及这些节点的子树),XPath表达式中包含13种轴,其中通常使用的children和descendant-or-self轴缩写为/ 和// 。
FLWOR表达式是XQuery对XPath的重要扩展之一,即for,let,where,order,return表达式的组合。
XML导入到oracle数据库实现import java.io.File;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Iterator;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class ImportXml {/*** 给定XML,解析后插入数据库** @param FilePath 文件的路径名:例如:"F:/creatXml.xml"* @throws ClassNotFoundException**/public static void importXml(String filePath){System.out.println("============开始导入============");// -------------jdbc代码try {Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@201.200.200.254:1521:xe";String user = "sspa";String password = "sspa";Connection con = DriverManager.getConnection(url, user, password);//打开事物con.setAutoCommit(false);//SQL执行语句String exeSql="";//插入值String insertValue="";//插入的列名String insertColumName="";//更新的SQL语句String updateSQL="";//SQL操作语句(用来判断数据库里就没有记录等)String optionSql="";//当前记录的ID值String rowID="";//ID的列名String idName="";int flag=0;//------------读取XML文件,获得document对象.SAXReader reader = new SAXReader();reader.setEncoding("GBK");Document document=null;document = reader.read(new File(filePath));//-----------获取文档的根节点.Element root= document.getRootElement();//遍历所有table节点for(Iterator rootIter = root.elementIterator("T able"); rootIter.hasNext();){ Element tableNode = (Element) rootIter.next();// 得到table节点的Name属性值,用来判断属于哪一个数据库表String tableName=tableNode.attributeValue("Name");//打印数据库表名System.out.println("数据库表名"+tableName);//取得table节点下的所有子节点,并且遍历for(Iterator tableIter = tableNode.elementIterator(); tableIter.hasNext();){ Element row = (Element) tableIter.next();//得到每一条记录里面的数据for(Iterator rowIter = row.elementIterator(); rowIter.hasNext();){flag++;Element col = (Element) rowIter.next();if (flag==1) {rowID=col.getT ext();idName=col.getName();}//得到当前节点的名字,用来判断属于数据库中的哪一列String columName=col.getName();//得到该节点的字段类型String columType=col.attributeValue("type");//得到当前节点的值,用来插入数据库中//列值。
ORACLE中解析XML、引言本文主要阐述一种在ORACLE中解析XML的实现方法。
在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。
2、现象描述当前,XML数据格式越来越多的应用于各种业务信息系统以及数据交换等应用范围,XML数据变得更加常见以及应用更为广泛。
在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。
3、处理过程XML数据可以为字符串(适合处理较小的xml数据)、物理文件或CLOB字段(处理较大的xml数据字段);以如下的XML数据为例来描述该解析处理过程。
XML数据格式示例如下:<?<xml version="1.0" encoding="GBK" ?> - <items> - <unit> - <item><name>单位名称</name><value>JXDL</value></item> - <item><name>年新增归档数</name><value>330</value></item></unit></</items>步骤1:定义或确定要解析的XML规则,如上。
步骤2:创建XML解析器实例XMLPARSER.parser,如下:xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;步骤3:定义DOM文档对象,如下:doc xmldom.DOMDocument;步骤4:定义解析XML所需要的其他对象,如下: lenUnit integer;lenItem integer;unitNodes xmldom.DOMNodeList;itemNodes xmldom.DOMNodeList;chilNodes xmldom.DOMNodeList;tempNode_unit xmldom.DOMNode;tempNode xmldom.DOMNode;tempArrMap xmldom.DOMNamedNodeMap;--================================--以下变量用于获取XML节点的值name varchar2(50);value varchar2(20);tmp integer;--================================xmlClobData clob;步骤5:获取xml数据,以下假设从数据表的clob字段中获取取,如下:select datastring into xmlClobData f rom p_xml_datainfo t where …… ;步骤6:解析xml数据,如下xmlPar := xmlparser.newParser;--xmlparser.parseBuffer(xmlPar,xmlString);--xmlparser.parseClob(xmlPar,xmlClobData);doc := xmlparser.getDocument( xmlPar );-- 释放解析器实例xmlparser.freeParser(xmlPar);-- 获取所有unit元素unitNodes := xmldom.getElementsByTagName( doc, 'unit' );lenUnit := xmldom.getLength( unitNodes );--遍历所有unit元素FOR i in 0..lenUnit-1LOOP--获取第i个unittempNode_unit := xmldom.item( unitNodes, i );itemNodes:=xmldom.getChildNodes(tempNode_unit); lenItem := xmldom.getLength( itemNodes ); FOR j in 0..lenItem-1LOOPtempNode := xmldom.item( itemNodes, j );--获取子元素的值chilNodes := xmldom.getChildNodes(tempNode); tmp :=xmldom.GETLENGTH( chilNodes ); name :=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));value :=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));DBMS_output.PUT_LINE(i||j,name,value); end loop;END LOOP;步骤7:释放文档对象xmldom.freeDocument(doc);步骤8:异常与错误处理EXCEPTIONWHEN OTHERS THENDBMS_output.PUT_LINE(SQLERRM);4、原因分析目前,在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net 等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。
OracleXML函数(转)1 介绍XML(eXtended Markup Language可扩展标记语⾔)是⼀种基于⽂本,⽤于结构化任何可标记⽂档的格式语⾔。
它是⼀种轻便的,可扩展的,标准的且简学易懂的保存数据的语⾔。
它起源于SGML,并可模拟为树型。
正因为这样,Oracle提供了⼀些函数来使⽤这种实⽤的语⾔来在数据库中保存⽂档。
因此,学习这些函数来使得保存的数据更加具有可读性是很必要的。
通过使⽤内置XMLType类型,Oracle允许将XML⽂档存放在数据库中,为了加强对XML的⽀持,Oracle还提供了⼀些XML函数。
1 .1准备阶段在介绍这些XML函数之前,请读者⾸先建⽴表XMLTABLE,并为其插⼊数据,SQL语句如下所⽰:SQL>CREATE TABLE XMLTABLE OF XMLTYPE;SQL>INSERT INTO xmltable VALUES(XMLTYPE ('<PurchaseOrder2 xmlns:xsi=""3 xsi:noNamespaceSchemaLocation="">4 <Reference>ADAMS-20011127121040988PST</Reference>5 <Actions>6 <Action>7 <User>SCOTT</User>8 <Date>2006-05-31</Date>9 <Reject/>10 <Requestor>Julie P. Adams</Requestor>11 <User>ADAMS</User>12 <CostCenter>R20</CostCenter>15 <ShippingInstructions>16 <name>Julie P. Adams</name>17 <address>Redwood Shores, CA 94065</address>18 <telephone>650 506 7300</telephone>19 </ShippingInstructions>20 <SpecialInstructions>Ground</SpecialInstructions>21 <LineItems>22 <LineItem ItemNumber="1">23 <Description>The Ruling Class</Description>24 <Part Id="0374********" UnitPrice="29.95" Quantity="3"/>25 </LineItem>30 <LineItem ItemNumber="3">31 <Description>8 1/2</Description>32 <Part Id="0374********" UnitPrice="39.95" Quantity="4"/>33 </LineItem>34 </LineItems>35 </PurchaseOrder>'));SQL> COMMIT;在创建完XMLTABLE以后,我来介绍⼀些在SQL中的⼀些主要的XML函数。
Oracle对XML格式数据的存取Oracle对XML格式数据的存取Oracle对XML格式数据的存取网上大部分的例子都是错误的最关键的地方就是要把表示row的标签设为rowtag,比如:?xmlversion='1.0'?rootrecordcolumn1 aaaa /column1column2 bbbb /column2/record/root假如你的表是tableaaa(aaavarchar(20),bbbvarchar(20))那么要指定哪个标签是记录开始啊.这儿就要指定save.setrowtag("record");一般从原来的表中得到的xml是用固定的rowsettag和rowtag.名字叫rowset和rwo比如:?xmlversion='1.0'?rowsetrownum="1"column1 aaaa /column1column2 bbbb /column2/row/rowset但你在得到字符串前可是指定你想要的名字:qry.setrowsettag("tablename");qry.setrowtag("recordname");这样就会得到?xmlversion='1.0'?tablenamerecordnamenum="1"column1 aaaa /column1column2 bbbb /column2/recordname/tablename所以你写进去的时候只要指定对应的标签为rowtag就行了:save.setrowtag("recordname");save.insertxml(xml);就ok了.另外,特别要注意xml是大小写敏感的,你的recordname和recordname是两个不同的tagOracle对XML格式数据的存取相关内容:。