是别人写的存储过程,但是第一次执行执行不了,原来是第一步没有设置导致的,故将过程写出来与各位共享
第一步 CREATE OR REPLACE DIRECTORY UTL_FILE_DIR as 'k:\datafile';--保存xml文件的目录
--'k:\datafile'是你本地的文件目录,必须存在,这一步必须要你登陆的oracle用户具有create DIRECTORY 权限,如果没有这个权限,请申请管理员添加该权限。
第二部 生成测试表
create table PEOPLE
(
PERSONID VARCHAR2(114) not null,
NAME VARCHAR2(150),
ADDRESS VARCHAR2(200),
TEL VARCHAR2(50),
FAX VARCHAR2(50),
EMAIL VARCHAR2(100)
)
第三部 存储过程
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,'UTL_FILE_DIR'||'/'||file_path,'GBK');
EXCEPTION
WHEN OTHERS THEN
DBMS_output.PUT_LINE(SQLERRM);
END OUTPUTPEOPLE;