编写Oracle存储过程解析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 > [email protected] EMAIL >
 9       PERSON >
10       < PERSON  PERSONID ="E02" >
11           < NAME > Bill Clinton NAME >
12           < ADDRESS > White House, USA ADDRESS >
13           < TEL > (001) 6400 98765 TEL >
14           < FAX > (001) 6400 98769 FAX >
15           < EMAIL > [email protected] EMAIL >
16       PERSON >
17       < PERSON  PERSONID ="E03" >
18           < NAME > Tom Cruise NAME >
19           < ADDRESS > 57 Jumbo Street, New York, USA ADDRESS >
20           < TEL > (001) 4500 67859 TEL >
21           < FAX > (001) 4500 67895 FAX >
22           < EMAIL > [email protected] EMAIL >
23       PERSON >
24       < PERSON  PERSONID ="E04" >
25           < NAME > Linda Goodman NAME >
26           < ADDRESS > 78 Crax Lane, London, UK ADDRESS >
27           < TEL > (061) 54 56789 TEL >
28           < FAX > (061) 54 56772 FAX >
29           < EMAIL > [email protected] EMAIL >
30       PERSON >
31  PEOPLE >


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

1  CREATE   TABLE  PEOPLE
2  (
3    PERSONID  VARCHAR2 ( 4 PRIMARY   KEY ,
4    NAME  VARCHAR2 ( 50 ),
5    ADDRESS  VARCHAR2 ( 200 ),
6    TEL  VARCHAR2 ( 20 ),
7    FAX  VARCHAR2 ( 20 ),
8    EMAIL  VARCHAR2 ( 100 )
9  );


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

 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;
10  -- //DOM文档对象
11  doc xmldom.DOMDocument;
12  len   integer ;
13  personNodes xmldom.DOMNodeList;
14  chilNodes xmldom.DOMNodeList;
15  tempNode xmldom.DOMNode;
16  tempArrMap xmldom.DOMNamedNodeMap;
17  -- ================================
18  -- 以下变量用于获取XML节点的值
19  pid  varchar2 ( 4 );
20  name  varchar2 ( 50 );
21  address  varchar2 ( 200 );
22  tel  varchar2 ( 20 );
23  fax  varchar2 ( 20 );
24  email  varchar ( 100 );
25  tmp  integer ;
26  -- ================================
27  BEGIN
28    xmlPar : =  xmlparser.newParser;
29    xmlparser.setErrorLog( xmlPar, log_path);
30    xmlparser.parse(xmlPar, file_path);
31    doc : =  xmlparser.getDocument( xmlPar );  
32     --  释放解析器实例
33    xmlparser.freeParser(xmlPar);
34     --  获取所有PERSON元素
35    personNodes : =  xmldom.getElementsByTagName( doc,  ' PERSON '  );
36     len  : =  xmldom.getLength( personNodes );
37     -- 遍历所有PERSON元素
38     FOR  i  in   0 .. len - 1
39    LOOP
40       -- 获取第i个PERSON
41      tempNode : =  xmldom.item( personNodes, i );
42       -- 所有属性
43      tempArrMap : =  xmldom.getAttributes(tempNode);
44       -- 获取PERSONID的值
45      pid : =  xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap, ' PERSONID ' ));
46       -- 获取子元素的值
47      chilNodes : =  xmldom.getChildNodes(tempNode);
48      tmp : =  xmldom.GETLENGTH( chilNodes );
49      name : =  xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes,  0  )));
50      address : =  xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes,  1  )));
51      tel : =  xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes,  2  )));
52      fax : =  xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes,  3  )));
53      email : =  xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes,  4  )));
54       -- 插入数据
55       INSERT   INTO  PEOPLE  VALUES  (pid,name,address,tel,fax,email);
56       COMMIT ;
57     END  LOOP;
58     --  释放文档对象
59    xmldom.freeDocument(doc);
60    EXCEPTION
61      WHEN  OTHERS  THEN
62       DBMS_output.PUT_LINE(SQLERRM);
63  END  addPerson; 



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


编写Oracle存储过程解析XML,并把数据持久化_第1张图片

你可能感兴趣的:(oracle,oracle)