【原创】编写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 >
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 );
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;
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;