Oracle 导出导入XML,准确来说是服务器端的导入导出,客户端的话需要事先通过应用程序传送到服务器端目录下..一般应用的话是不会在服务器端进行解析的,除非是DBA操作,作为学习看了解下,以下通过测试,测试环境ORACLE 9I 版本号,9.0.2.1
创建测试表:
CREATE TABLE PEOPLE
(
PERSONID VARCHAR2(10) PRIMARY KEY,
NAME VARCHAR2(20),
ADDRESS VARCHAR2(60),
TEL VARCHAR2(20),
FAX VARCHAR2(20),
EMAIL VARCHAR2(40)
);
XML文件数据,保存为people.xml,放置于D盘下的TEST目录下:
<?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@everywhere.com</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@everywhere.com</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@everywhere.com</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@everywhere.com</EMAIL>
</PERSON>
</PEOPLE>
导入XML文件到数据表中的存储过程:
执行存储过程:
SQL> call addPerson('D:/test/people.xml','D:/test/people.log');
Method called
SQL> select * from people;
PERSONID NAME ADDRESS TEL FAX EMAIL
E01 Tony Blair 10 Downing Street, London, UK (061) 98765 (061) 98768 blair@everywhere.com
E02 Bill Clinton White House, USA (001) 6400 98765 (001) 6400 98769 bill@everywhere.com
E03 Tom Cruise 57 Jumbo Street, New York, USA (001) 4500 67859 (001) 4500 67895 cruise@everywhere.com
E04 Linda Goodman 78 Crax Lane, London, UK (061) 54 56789 (061) 54 56772 linda@everywhere.com
导出的存储过程:输入导出路径就可以了,下面是用来嵌套存储过程,由于没有用到XML操作方面的,没有去深究,但是还有一篇文章对导出做了更详细的说明,参考http://weiwu83.javaeye.com/blog/151855
--将数据库中的数据导出成xml文件的过程
create or replace procedure db2xml(xmlfile varchar2) as
doc 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.DOMNode,
v_pid varchar2,v_name varchar2,v_addr varchar2,
v_tel varchar2,v_fax varchar2,v_email varchar2)
is
personelem 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(personelem));
--向PERSON结点中添加NAME元素
itemelem := xmldom.createElement(doc,'NAME');
-- 将NAME结点添加到PERSON结点中
itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
-- 创建文本结点
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(itemelem));
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(itemelem));
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(itemelem));
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(itemelem));
text := xmldom.createTextNode(doc,v_email);
itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
end addperson;
begin
--创建一个新DOM文档对像
doc := xmldom.newDOMDocument;
--为文档添加根结点PEOPLE
peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
--使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中
for v_row in cur_people loop
addperson(doc,peoplenode,v_row.personid,v_row.name,
v_row.address,v_row.tel,v_row.fax,v_row.email);
end loop;
--将结果写入指定文件
xmldom.writeToFile(doc,xmlfile);
xmldom.freeDocument(doc);
end db2xml;
备注:此存储过程执行得到的和原来比较少了XML头,添加进去就好了