oracle xml处理

来源:互联网 发布:免费医疗软件 编辑:程序博客网 时间:2024/05/01 04:58
【原创】编写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>

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>bill@everywhere.com</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>cruise@everywhere.com</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>linda@everywhere.com</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 );


假设表里面已经有数据,如果想从XML插入数据请看【原创】编写Oracle存储过程解析XML,并把数据持久化



以下是把查询结果生成XML文件的存储过程代码:

 1 /**

 2 *sqlStr        附加的查询条件 如:where PERSONID = 'E01',查询所有输入''

 3 *file_path     文件保存路径   如:D:\OracleTest\outpeople.xml

 4 **/

 5 CREATE OR REPLACE PROCEDURE OUTPUTPEOPLE(sqlStr VARCHAR2,file_path VARCHAR2)

 6 AS

 7     personRow PEOPLE%ROWTYPE;      --获取游标的行变量

 8     TYPE person_cur IS REF CURSOR; --自定义REF游标

 9     cur person_cur;    

10     tempSql varchar2(500) := 'SELECT * FROM PEOPLE ';       --初始的查询语句

11     doc xmlDom.DOMDocument := xmldom.newDOMDocument;        -- 创建文档对象

12     main_node xmlDom.DOMNode := xmldom.makeNode(doc);       -- 获得文档节点

13     root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, 'PEOPLE');   -- 创建根元素

14     --==================================================

15     --以下定义元素

16     person_elmt xmlDom.DOMElement;      --定义PERSON元素

17     name_elmt xmlDom.DOMElement;      --定义NAME元素

18     address_elmt xmlDom.DOMElement;      --定义ADDRESS元素

19     tel_elmt xmlDom.DOMElement;           --定义TEL元素    

20     email_elmt xmlDom.DOMElement;      --定义EMAIL元素    

21     --==================================================

22     --以下定义节点

23     root_node xmlDom.DOMNode;   --定义PEOPLE节点

24     person_node xmlDom.DOMNode;   --定义PERSON节点

25     name_node xmlDom.DOMNode;   --定义NAME节点

26     address_node xmlDom.DOMNode;   --定义ADDRESS节点

27     tel_node xmlDom.DOMNode;   --定义TEL节点

28     email_node xmlDom.DOMNode;   --定义EMAIL节点

29     temp_node xmlDom.DOMNode;

30 BEGIN

31     -- 向文档节点加入根节点:<PEOPLE></PEOPLE>

32     root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));

33     --附加查询条件

34     tempSql := tempSql||sqlStr;

35     --打开游标

36     OPEN cur FOR tempSql;

37     --遍历游标

38     LOOP

39       FETCH cur INTO personRow;

40       EXIT WHEN cur%NOTFOUND;

41       --===========================================================================--

42       person_elmt := xmldom.createElement(doc, 'PERSON'); --创建PERSON元素

43       -- 向PEOPLE节点加入PERSON节点<PERSON></PERSON>

44       person_node := xmldom.appendChild(root_node, xmldom.makeNode(person_elmt));

45       --===========================================================================--

46       --向PERSON节点加入属性PERSONID

47       xmlDom.SETATTRIBUTE( person_elmt, 'PERSONID', personRow.personId );

48       --===========================================================================--

49       name_elmt := xmldom.createElement(doc, 'NAME');      --创建NAME元素

50       --向PERSON节点加入子节点NAME

51       name_node := xmldom.appendChild(person_node,xmlDom.makeNode(name_elmt));

52       --向NAME节点加入文本

53       temp_node := xmldom.appendChild(name_node , xmlDom.makeNode(xmldom.createTextNode(doc,personRow.name)));

54       --===========================================================================--

55       address_elmt := xmldom.createElement(doc, 'ADDRESS');      --创建ADDRESS元素

56       --向PERSON节点加入子节点ADDRESS

57       address_node := xmldom.appendChild(person_node,xmlDom.makeNode(address_elmt));

58       --向ADDRESS节点加入文本

59       temp_node := xmldom.appendChild(address_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.address)));

60       --===========================================================================--

61       tel_elmt := xmldom.createElement(doc, 'TEL');      --创建TEL元素    

62       --向TEL节点加入子节点NAME

63       tel_node := xmldom.appendChild(person_node,xmlDom.makeNode(tel_elmt));

64       --向TEL节点加入文本

65       temp_node := xmldom.appendChild(tel_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.tel)));

66       --===========================================================================--

67       email_elmt := xmldom.createElement(doc, 'EMAIL');      --创建EMAIL元素    

68       --向PERSON节点加入子节点EMAIL

69       email_node := xmldom.appendChild(person_node,xmlDom.makeNode(email_elmt));

70       --向EMAIL节点加入文本

71       temp_node := xmldom.appendChild(email_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.email)));

72       --===========================================================================--

73     END LOOP;

74     CLOSE cur;

75     --写入硬盘

76     xmlDom.writeToFile(doc,file_path,'GBK');

77   EXCEPTION

78    WHEN OTHERS THEN

79      DBMS_output.PUT_LINE(SQLERRM);

80 END OUTPUTPEOPLE;












Jam Chan 2008-03-19 21:48 发表评论【原创】编写Oracle存储过程解析XML,并把数据持久化2008年3月19日 21:40需要解析的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>

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>bill@everywhere.com</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>cruise@everywhere.com</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>linda@everywhere.com</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;








存储过程截图