【原创】编写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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值