C#调用存储过程实现Oracle数据库数据到XML文件的转换

需要解析的xml文件:people.xml:

猪猪

山东济南
18653111111 zsy214@163.com


在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();

评论已关闭