您的位置:首页 > 数据库 > Oracle

编写 Oracle存储过程解析XML

2010-06-03 10:41 204 查看
我在做项目的时候,遇到一个问题,数据不断的下发,我需要不断的插入数据库,数据量很大,但是这一条条插入数据库,肯定不行,在上网查中,我发现将数据写入xml文件,我一段时间统一将数据插入数据库很好,而oralce存储过程又支持解析xml,Oracle存储过程解析XML过程如下:

需要解析的xml文件:people.xml

1 <?xml version="1.0"?>
2 <PEOPLE>
3 <PERSON PERSONID="E01">
4 <NAME>Tony Blair</NAME>
5 <ADDRESS>10 Downing Street, London, UK</ADDRESS>
6 <TEL>(061) 98765</TEL>
7 <FAX>(061) 98768</FAX>
8 <EMAIL>blair@everywhere.com</EMAIL>
9 </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>

我以scott用户为例,新建表:

CREATE TABLE PEOPLE
(
PERSONID VARCHAR2(4) PRIMARY KEY,
NAME VARCHAR2(50),
ADDRESS VARCHAR2(200),
TEL VARCHAR2(20),
FAX VARCHAR2(20),
EMAIL VARCHAR2(100)
);

解析并持久化的存储过程代码:

1 /**
2 *file_path 需要解析的XML文件路径 如:D:\OracleTest\people.xml
3 *log_path 保存日志的文件的路径 如: D:\OracleTest\xmllog.txt
4 **/
5
6 CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)
7 AS
8 --//XML解析器
9 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;

有许多朋友都说执行时出现错误,现在我把我在Oracle9i使用的截图贴出来,以作参考:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: