Oracle 导出导入XML

Oracle 导出导入XML,准确来说是服务器端的导入导出,客户端的话需要事先通过应用程序传送到服务器端目录下..一般应用的话是不会在服务器端进行解析的,除非是DBA操作,作为学习看了解下,以下通过测试,测试环境ORACLE 9I 版本号,9.0.2.1

创建测试表:
CREATE TABLE PEOPLE
(
   PERSONID 
VARCHAR2(10PRIMARY 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>[email protected]</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>[email protected]</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>[email protected]</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>[email protected]</EMAIL>
    
</PERSON>
</PEOPLE>

导入XML文件到数据表中的存储过程:

/** *file_path 需要解析的XML文件路径 如:D:/Test/people.xml *log_path 保存日志的文件的路径 如: D:/Test/xmllog.txt **/ CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2) AS --//XML解析器 xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER; --//DOM文档对象 doc xmldom.DOMDocument; len integer; personNodes xmldom.DOMNodeList; chilNodes xmldom.DOMNodeList; tempNode xmldom.DOMNode; tempArrMap xmldom.DOMNamedNodeMap; --================================ --以下变量用于获取XML节点的值 pid varchar2(4); name varchar2(50); address varchar2(200); tel varchar2(20); fax varchar2(20); email varchar(100); tmp integer; --================================ BEGIN xmlPar := xmlparser.newParser; xmlparser.setErrorLog( xmlPar, log_path); xmlparser.parse(xmlPar, file_path); doc := xmlparser.getDocument( xmlPar ); -- 释放解析器实例 xmlparser.freeParser(xmlPar); -- 获取所有PERSON元素 personNodes := xmldom.getElementsByTagName( doc, 'PERSON' ); len := xmldom.getLength( personNodes ); --遍历所有PERSON元素 FOR i in 0..len-1 LOOP --获取第i个PERSON tempNode := xmldom.item( personNodes, i ); --所有属性 tempArrMap := xmldom.getAttributes(tempNode); --获取PERSONID的值 pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'PERSONID')); --获取所有子节点 chilNodes := xmldom.getChildNodes(tempNode); --获取子节点的个数 tmp := xmldom.GETLENGTH( chilNodes ); --获取各个子节点的值 name := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 ))); address := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 ))); tel := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 ))); fax := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 ))); email := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 ))); --插入数据 INSERT INTO PEOPLE VALUES (pid,name,address,tel,fax,email); COMMIT; END LOOP; -- 释放文档对象 xmldom.freeDocument(doc); EXCEPTION WHEN OTHERS THEN DBMS_output.PUT_LINE(SQLERRM); END addPerson;

 

执行存储过程:

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 [email protected]
E02 Bill Clinton White House, USA (001) 6400 98765 (001) 6400 98769 [email protected]
E03 Tom Cruise 57 Jumbo Street, New York, USA (001) 4500 67859 (001) 4500 67895 [email protected]
E04 Linda Goodman 78 Crax Lane, London, UK (061) 54 56789 (061) 54 56772 [email protected]

导出的存储过程:输入导出路径就可以了,下面是用来嵌套存储过程,由于没有用到XML操作方面的,没有去深究,但是还有一篇文章对导出做了更详细的说明,参考http://weiwu83.javaeye.com/blog/151855

--将数据库中的数据导出成xml文件的过程 
create or replace procedure db2xml(xmlfile varchar2as
  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头,添加进去就好了

你可能感兴趣的:(oracle,xml,Integer,文档,Path,email)