随笔-14  评论-34  文章-0  trackbacks-0
需要解析的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(4PRIMARY 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;





posted on 2008-03-19 21:48 Jam Chan 阅读(3037) 评论(3)  编辑  收藏 所属分类: Oracle

评论:
# re: 【原创】编写Oracle存储过程,按照条件把数据导出至XML文件[未登录] 2008-12-07 20:38 | 过客
为何我报的错误为invalid char in text  回复  更多评论
  
# re: 【原创】编写Oracle存储过程,按照条件把数据导出至XML文件[未登录] 2008-12-07 20:40 | 过客
我写的代码如下: (pid number,file_path varchar2)
is
doc xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象
main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点
root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, 'PEOPLE'); -- 创建根元素
person_elmt xmlDom.DOMElement; --定义PERSON元素
name_elmt xmlDom.DOMElement; --定义NAME元素
qyjs_elmt xmlDom.DOMElement; --定义QYJS元素
filename_elmt xmlDom.DOMElement; --定义filename元素
root_node xmlDom.DOMNode; --定义PEOPLE节点
person_node xmlDom.DOMNode; --定义PERSON节点
name_node xmlDom.DOMNode; --定义NAME节点
qyjs_node xmlDom.DOMNode; --定义qyjs节点
filename_node xmlDom.DOMNode; --定义filename节点
temp_node xmlDom.DOMNode;

v_name varchar2(64);
v_qyjs varchar2(500);
v_filename varchar2(200);
begin
SELECT NAME INTO v_name FROM FILIALE WHERE ID=pid;
SELECT QYJS INTO v_qyjs FROM FILIALE WHERE ID=pid;
SELECT OFILENAME INTO v_filename FROM FILIALE WHERE ID=pid;
--生成xml文档
-- 向文档节点加入根节点:<PEOPLE></PEOPLE>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));

person_elmt := xmldom.createElement(doc, 'PERSON'); --创建PERSON元素
-- 向PEOPLE节点加入PERSON节点<PERSON></PERSON>
person_node := xmldom.appendChild(root_node, xmldom.makeNode(person_elmt));

--向PERSON节点加入属性PERSONID
xmlDom.SETATTRIBUTE( person_elmt, 'PERSONID', pid );

name_elmt := xmldom.createElement(doc, 'NAME'); --创建NAME元素
--向PERSON节点加入子节点NAME
name_node := xmldom.appendChild(person_node,xmlDom.makeNode(name_elmt));

--向NAME节点加入文本
temp_node := xmldom.appendChild(name_node , xmlDom.makeNode(xmldom.createTextNode(doc,v_name)));

qyjs_elmt := xmldom.createElement(doc, 'QYJS'); --创建qyjs元素
--向PERSON节点加入子节点qyjs
qyjs_node := xmldom.appendChild(person_node,xmlDom.makeNode(qyjs_elmt));
--向qyjs节点加入文本
temp_node := xmldom.appendChild(qyjs_node,xmlDom.makeNode(xmldom.createTextNode(doc,v_qyjs)));

filename_elmt := xmldom.createElement(doc, 'FILENAME'); --创建filename元素
--向filename节点加入子节点filename
filename_node := xmldom.appendChild(person_node,xmlDom.makeNode(filename_elmt));
--向filename节点加入文本
temp_node := xmldom.appendChild(filename_node, xmlDom.makeNode(xmldom.createTextNode(doc,v_filename)));

--写入硬盘
xmldom.setVersion(doc, '1.0 ');
xmlDom.writeToFile(doc,file_path,'GBK');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
end CJXML;
为何报invalid char in text   回复  更多评论
  
# re: 【原创】编写Oracle存储过程,按照条件把数据导出至XML文件 2009-03-22 22:42 | ljjhxyljj
这个例子是不是不能在oracle8i中通过?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: