需要解析的xml文件:people.xml:
在Oracle中编写查询Oracle数据库,把结果封装成XML文件的存储过程:
CREATE OR REPLACE PROCEDURE OUTPUTPEOPLE( sqlStr VARCHAR2) AS personRow PEOPLE%ROWTYPE; --获取游标的行变量 TYPE person_cur IS REF CURSOR; --自定义REF游标 cur person_cur; tempSql varchar2(500) := 'SELECT * FROM PEOPLE '; --初始的查询语句 --sqlStr VARCHAR2(500):= 'WHERE PERSONID = 1 '; file_path VARCHAR2(500):='D:\temp\outpeople.xml'; 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 -- 向文档节点加入根节点: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_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;
在PL/SQL中测试存储过程:
-- Created on 2011/5/11 by PIGWAY.CN
declare
i integer;
begin
OUTPUTPEOPLE('WHERE PERSONID =1');
end;
最后在VS中,使用C#调用次此存储过程:
OracleConnection conn =getConn();
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "OUTPUTPEOPLE";//声明存储过程名
cmd.CommandType = CommandType.StoredProcedure;OracleParameter[] parameters ={ new OracleParameter("sqlStr",OracleType.VarChar,20)};
parameters[0].Value = "where PERSONID = 1";
foreach (OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
}
conn.Close();
评论已关闭