/**
*sqlStr 附加的查询条件 如:where PERSONID = 'E01',查询所有输入''
*file_path 文件保存路径 如:D:\OracleTest\outpeople.xml
**/
CREATE OR REPLACE PROCEDURE OUTPUTPEOPLE(sqlStr VARCHAR2,file_path VARCHAR2)
AS
personRow PEOPLE%ROWTYPE; --获取游标的行变量
TYPE person_cur IS REF CURSOR; --自定义REF游标
cur person_cur;
tempSql varchar2(500) := 'SELECT * FROM PEOPLE '; --初始的查询语句
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元素
address_elmt xmlDom.DOMElement; --定义ADDRESS元素
tel_elmt xmlDom.DOMElement; --定义TEL元素
email_elmt xmlDom.DOMElement; --定义EMAIL元素
--==================================================
--以下定义节点
root_node xmlDom.DOMNode; --定义PEOPLE节点
person_node xmlDom.DOMNode; --定义PERSON节点
name_node xmlDom.DOMNode; --定义NAME节点
address_node xmlDom.DOMNode; --定义ADDRESS节点
tel_node xmlDom.DOMNode; --定义TEL节点
email_node xmlDom.DOMNode; --定义EMAIL节点
temp_node xmlDom.DOMNode;
BEGIN
-- 向文档节点加入根节点:<PEOPLE></PEOPLE>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
--附加查询条件
tempSql := tempSql||sqlStr;
--打开游标
OPEN cur FOR tempSql;
--遍历游标
LOOP
FETCH cur INTO personRow;
EXIT WHEN cur%NOTFOUND;
--===========================================================================--
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', personRow.personId );
--===========================================================================--
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,personRow.name)));
--===========================================================================--
address_elmt := xmldom.createElement(doc, 'ADDRESS'); --创建ADDRESS元素
--向PERSON节点加入子节点ADDRESS
address_node := xmldom.appendChild(person_node,xmlDom.makeNode(address_elmt));
--向ADDRESS节点加入文本
temp_node := xmldom.appendChild(address_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.address)));
--===========================================================================--
tel_elmt := xmldom.createElement(doc, 'TEL'); --创建TEL元素
--向TEL节点加入子节点NAME
tel_node := xmldom.appendChild(person_node,xmlDom.makeNode(tel_elmt));
--向TEL节点加入文本
temp_node := xmldom.appendChild(tel_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.tel)));
--===========================================================================--
email_elmt := xmldom.createElement(doc, 'EMAIL'); --创建EMAIL元素
--向PERSON节点加入子节点EMAIL
email_node := xmldom.appendChild(person_node,xmlDom.makeNode(email_elmt));
--向EMAIL节点加入文本
temp_node := xmldom.appendChild(email_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.email)));
--===========================================================================--
END LOOP;
CLOSE cur;
--写入硬盘
xmlDom.writeToFile(doc,file_path,'GBK');
EXCEPTION
WHEN OTHERS THEN
DBMS_output.PUT_LINE(SQLERRM);
END OUTPUTPEOPLE;
*sqlStr 附加的查询条件 如:where PERSONID = 'E01',查询所有输入''
*file_path 文件保存路径 如:D:\OracleTest\outpeople.xml
**/
CREATE OR REPLACE PROCEDURE OUTPUTPEOPLE(sqlStr VARCHAR2,file_path VARCHAR2)
AS
personRow PEOPLE%ROWTYPE; --获取游标的行变量
TYPE person_cur IS REF CURSOR; --自定义REF游标
cur person_cur;
tempSql varchar2(500) := 'SELECT * FROM PEOPLE '; --初始的查询语句
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元素
address_elmt xmlDom.DOMElement; --定义ADDRESS元素
tel_elmt xmlDom.DOMElement; --定义TEL元素
email_elmt xmlDom.DOMElement; --定义EMAIL元素
--==================================================
--以下定义节点
root_node xmlDom.DOMNode; --定义PEOPLE节点
person_node xmlDom.DOMNode; --定义PERSON节点
name_node xmlDom.DOMNode; --定义NAME节点
address_node xmlDom.DOMNode; --定义ADDRESS节点
tel_node xmlDom.DOMNode; --定义TEL节点
email_node xmlDom.DOMNode; --定义EMAIL节点
temp_node xmlDom.DOMNode;
BEGIN
-- 向文档节点加入根节点:<PEOPLE></PEOPLE>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
--附加查询条件
tempSql := tempSql||sqlStr;
--打开游标
OPEN cur FOR tempSql;
--遍历游标
LOOP
FETCH cur INTO personRow;
EXIT WHEN cur%NOTFOUND;
--===========================================================================--
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', personRow.personId );
--===========================================================================--
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,personRow.name)));
--===========================================================================--
address_elmt := xmldom.createElement(doc, 'ADDRESS'); --创建ADDRESS元素
--向PERSON节点加入子节点ADDRESS
address_node := xmldom.appendChild(person_node,xmlDom.makeNode(address_elmt));
--向ADDRESS节点加入文本
temp_node := xmldom.appendChild(address_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.address)));
--===========================================================================--
tel_elmt := xmldom.createElement(doc, 'TEL'); --创建TEL元素
--向TEL节点加入子节点NAME
tel_node := xmldom.appendChild(person_node,xmlDom.makeNode(tel_elmt));
--向TEL节点加入文本
temp_node := xmldom.appendChild(tel_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.tel)));
--===========================================================================--
email_elmt := xmldom.createElement(doc, 'EMAIL'); --创建EMAIL元素
--向PERSON节点加入子节点EMAIL
email_node := xmldom.appendChild(person_node,xmlDom.makeNode(email_elmt));
--向EMAIL节点加入文本
temp_node := xmldom.appendChild(email_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.email)));
--===========================================================================--
END LOOP;
CLOSE cur;
--写入硬盘
xmlDom.writeToFile(doc,file_path,'GBK');
EXCEPTION
WHEN OTHERS THEN
DBMS_output.PUT_LINE(SQLERRM);
END OUTPUTPEOPLE;