XML和Oracle数据相互导出

1、创建目录:

  以管理员用户登录

  conn system/manager@orcl;

  ②创建目录

   create or replace directory xml2oracle_dir as 'd://xml2oracle';  

   ③授予读取和写入的权限给用户

   grant read,write on directory xml2oracle_dir to jwtimp;

   ④用指定用户身份登录

   conn jwtimp/jwtimp@orcl; 

   ⑤测试程序,当然,这段程序是从网上高人博客复制过去,忘了地址了,呵呵。

   注:此段代码已经测试通过,网上相同代码由于没有给出路径引用的的问题,导致很多人走 了很多弯路...

 

   CREATE TABLE PEOPLE
   (
     PERSONID VARCHAR2(10) PRIMARY KEY,
     NAME VARCHAR2(20),
     ADDRESS VARCHAR2(60),
     TEL  VARCHAR2(20),
     FAX  VARCHAR2(20),
     EMAIL VARCHAR2(40)
  );

--从xml文件载入数据保存到数据库的过程
create or replace procedure xml2db(xmlfile varchar2) as
--create or replace procedure xml2db(content clob) as
  p xmlparser.Parser;
  doc xmldom.DOMDocument;
  n xmldom.DOMNode;
  nl xmldom.DOMNodeList;
  len number;
 
  --根据PERSON结点生成插入SQL语句的过程
  function insertsql(node xmldom.DOMNode) return varchar2
  is
    n xmldom.DOMNode;
    nl xmldom.DOMNodeList;
    len number;
    nnm xmldom.DOMNamedNodeMap;
    isql varchar2(200);
  begin
    --取得PERSON结点所有属性
    nnm := xmldom.getAttributes(node);
    isql := 'insert into people values(';
    isql := isql || '''';
    --取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中
    isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0));
    isql := isql || '''';
    --取得PERSON结点下的所有结点,准备遍历
    nl := xmldom.getChildNodes(node);
    len := xmldom.getLength(nl);
    for i in 0..len-1 loop
      --取出第i个结点
      n := xmldom.item(nl,i);
      isql := isql || ',';
      isql := isql || '''';
      --将结点的文本值取出并拼接到SQL语句中
      isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n));
      isql := isql || '''';
    end loop;
    isql := isql || ')';
    return isql;
  end insertsql;--end function
 
begin
  p := xmlparser.newParser;
  xmlparser.parse(p,xmlfile);
  --xmlparser.parse(p,content);
  --转换xml文件成DOM对像
  doc := xmlparser.getDocument(p);
  xmlparser.freeParser(p);
  --取出所有PERSON元素
  nl := xmldom.getElementsByTagName(doc,'PERSON');
  len := xmldom.getLength(nl);
  --清空people表的内容
  delete from people;
  for i in 0..len-1 loop
    --取出第i个PERSON元素
    n := xmldom.item(nl,i);
    --执行插入该PERSON元素所用的SQL语句
    execute immediate insertsql(n);
  end loop;
  commit;
  xmldom.freeDocument(doc);
end xml2db;
/

--将数据库中的数据导出成xml文件的过程
create or replace procedure db2xml(xmlfile varchar2) as
  doc xmldom.DOMDocument;
  ret xmldom.DOMNode;
  peoplenode xmldom.DOMNode;
  --遍历整个people表的游标
  Cursor cur_people is select * from people;
  --将people表中一行记录转换为元素
  --并插入到DOM文档对像根结点PEOPLE下的过程
  procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNode,
                      v_pid varchar2,v_name varchar2,v_addr varchar2,
                      v_tel varchar2,v_fax varchar2,v_email varchar2)
  is
    personelem xmldom.DOMElement;
    personnode xmldom.DOMNode;
    itemelem xmldom.DOMElement;
    itemnode xmldom.DOMNode;
    text xmldom.DOMText;
  begin
    --创建PERSON结点
    personelem := xmldom.createElement(doc,'PERSON');
    --设置PERSONID属性
    xmldom.setAttribute(personelem,'PERSONID',v_pid);
    personnode := xmldom.appendChild(peoplenode,xmldom.makeNode(personelem));
    --向PERSON结点中添加NAME元素
    itemelem := xmldom.createElement(doc,'NAME');
    --  将NAME结点添加到PERSON结点中
    itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
    --  创建文本结点
    text := xmldom.createTextNode(doc,v_name);
    --  将文本结点添加到NAME结点下,以构成完整NAME元素
    itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
    --向PERSON结点中添加ADDRESS元素
    itemelem := xmldom.createElement(doc,'ADDRESS');
    itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
    text := xmldom.createTextNode(doc,v_addr);
    itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
    --向PERSON结点中添加TEL元素
    itemelem := xmldom.createElement(doc,'TEL');
    itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
    text := xmldom.createTextNode(doc,v_tel);
    itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
    --向PERSON结点中添加FAX元素
    itemelem := xmldom.createElement(doc,'FAX');
    itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
    text := xmldom.createTextNode(doc,v_fax);
    itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
    --向PERSON结点中添加EMAIL元素
    itemelem := xmldom.createElement(doc,'EMAIL');
    itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
    text := xmldom.createTextNode(doc,v_email);
    itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
  end addperson;
begin
  --创建一个新DOM文档对像
  doc := xmldom.newDOMDocument;
  --为文档添加根结点PEOPLE
  peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
  ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
  --使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中
  for v_row in cur_people loop
    addperson(doc,peoplenode,v_row.personid,v_row.name,
              v_row.address,v_row.tel,v_row.fax,v_row.email);
  end loop;
  --将结果写入指定文件
  xmldom.writeToFile(doc,xmlfile);
  xmldom.freeDocument(doc);
end db2xml;
/

  ⑥调用存储过程导入和导出数据  
  xml==>oracle   exec xml2db('XML2ORACLE_DIR'||'/'||'xml2oracle.xml');

  oracle==>xml   exec db2xml('XML2ORACLE_DIR'||'/'||'oracle2xml.xml');

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值