Oracle_导入导出xml

 

Oracle 导出 导入 XML 文件数据

Oracle 导出导入XML,准确来说是服务器端的导入导出,客户端的话需要事先通过应用程序传送到服务器端目录下..一般应用的话是不会在服务器端进行解析的,除非是DBA操作,作为学习看了解下,以下通过测试,测试环境ORACLE 9I 版本号,9.0.2.1

创建测试表:

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

XML文件数据,保存为people.xml,放置于D盘下的TEST目录下:

<?xml version="1.0"?>
<PEOPLE>
    <PERSON PERSONID="E01">
        <NAME>Tony Blair</NAME>
        <ADDRESS>10 Downing Street, London, UK</ADDRESS>
        <TEL>(061) 98765</TEL><FAX>(061) 98768</FAX>
        <EMAIL>blair@everywhere.com</EMAIL>
    </PERSON>
    <PERSON PERSONID="E02">
        <NAME>Bill Clinton</NAME>
        <ADDRESS>White House, USA</ADDRESS>
        <TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX>
        <EMAIL>bill@everywhere.com</EMAIL>
    </PERSON>
    <PERSON PERSONID="E03">
        <NAME>Tom Cruise</NAME>
        <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
        <TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX>
        <EMAIL>cruise@everywhere.com</EMAIL>
    </PERSON>
    <PERSON PERSONID="E04">
        <NAME>Linda Goodman</NAME>
        <ADDRESS>78 Crax Lane, London, UK</ADDRESS>
        <TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX>
        <EMAIL>linda@everywhere.com</EMAIL>
    </PERSON>
</PEOPLE>

导入XML文件到数据表中的存储过程:

复制代码 

1. /** 

2. *file_path     需要解析的XML文件路径 如:D:\Test\people.xml 

3. *log_path      保存日志的文件的路径  : D:\Test\xmllog.txt 

4. **/ 

5. CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2) 

6. AS 

7. --//XML解析器 

8. xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER; 

9. --//DOM文档对象 

10. doc xmldom.DOMDocument; 

11. len integer; 

12. personNodes xmldom.DOMNodeList; 

13. chilNodes xmldom.DOMNodeList; 

14. tempNode xmldom.DOMNode; 

15. tempArrMap xmldom.DOMNamedNodeMap; 

16. --================================ 

17. --以下变量用于获取XML节点的值 

18. pid varchar2(4); 

19. name varchar2(50); 

20. address varchar2(200); 

21. tel varchar2(20); 

22. fax varchar2(20); 

23. email varchar(100); 

24. tmp integer; 

25. --================================ 

26. BEGIN 

27.    xmlPar := xmlparser.newParser; 

28.    xmlparser.setErrorLog( xmlPar, log_path); 

29.    xmlparser.parse(xmlPar, file_path); 

30.    doc := xmlparser.getDocument( xmlPar );   

31.    -- 释放解析器实例 

32.    xmlparser.freeParser(xmlPar); 

33.    -- 获取所有PERSON元素 

34.    personNodes := xmldom.getElementsByTagName( doc, 'PERSON' ); 

35.    len := xmldom.getLength( personNodes ); 

36.    --遍历所有PERSON元素 

37.    FOR i in 0..len-1 

38.    LOOP 

39.      --获取第iPERSON 

40.      tempNode := xmldom.item( personNodes, i ); 

41.      --所有属性 

42.      tempArrMap := xmldom.getAttributes(tempNode); 

43.      --获取PERSONID的值 

44.      pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'PERSONID')); 

45.      --获取所有子节点 

46.      chilNodes := xmldom.getChildNodes(tempNode); 

47.      --获取子节点的个数 

48.      tmp := xmldom.GETLENGTH( chilNodes ); 

49.      --获取各个子节点的值 

50.      name := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 ))); 

51.      address := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 ))); 

52.      tel := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 ))); 

53.      fax := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 ))); 

54.      email := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 ))); 

55.      --插入数据 

56.      INSERT INTO PEOPLE VALUES (pid,name,address,tel,fax,email); 

57.      COMMIT; 

58.    END LOOP; 

59.    -- 释放文档对象 

60.    xmldom.freeDocument(doc); 

61.    EXCEPTION 

62.     WHEN OTHERS THEN 

63.       DBMS_output.PUT_LINE(SQLERRM); 

64. END addPerson; 



执行存储过程:

SQL> call addPerson('D:\test\people.xml','D:\test\people.log');

Method called


SQL> select * from people;

PERSONID NAME ADDRESS TEL FAX EMAIL
E01 Tony Blair 10 Downing Street, London, UK (061) 98765 (061) 98768 blair@everywhere.com
E02 Bill Clinton White House, USA (001) 6400 98765 (001) 6400 98769 bill@everywhere.com
E03 Tom Cruise 57 Jumbo Street, New York, USA (001) 4500 67859 (001) 4500 67895 cruise@everywhere.com
E04 Linda Goodman 78 Crax Lane, London, UK (061) 54 56789 (061) 54 56772 linda@everywhere.com



导出的存储过程:输入导出路径就可以了,下面是用来嵌套存储过程

复制代码 

1. --将数据库中的数据导出成xml文件的过程 

2. create or replace procedure db2xml(xmlfile varchar2) as 

3.   doc xmldom.DOMDocument; 

4.   ret xmldom.DOMNode; 

5.   peoplenode xmldom.DOMNode; 

6.   --遍历整个people表的游标 

7.   Cursor cur_people is select * from people; 

8.   --people表中一行记录转换为元素 

9.   --并插入到DOM文档对像根结点PEOPLE下的过程 

10.   procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNode, 

11.                       v_pid varchar2,v_name varchar2,v_addr varchar2, 

12.                       v_tel varchar2,v_fax varchar2,v_email varchar2) 

13.   is 

14.     personelem xmldom.DOMElement; 

15.     personnode xmldom.DOMNode; 

16.     itemelem xmldom.DOMElement; 

17.     itemnode xmldom.DOMNode; 

18.     text xmldom.DOMText; 

19.   begin 

20.     --创建PERSON结点 

21.     personelem := xmldom.createElement(doc,'PERSON'); 

22.     --设置PERSONID属性 

23.     xmldom.setAttribute(personelem,'PERSONID',v_pid); 

24.     personnode := xmldom.appendChild(peoplenode,xmldom.makeNode(personelem)); 

25.     --PERSON结点中添加NAME元素 

26.     itemelem := xmldom.createElement(doc,'NAME'); 

27.     --  NAME结点添加到PERSON结点中 

28.     itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); 

29.     --  创建文本结点 

30.     text := xmldom.createTextNode(doc,v_name); 

31.     --  将文本结点添加到NAME结点下,以构成完整NAME元素 

32.     itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); 

33.     --PERSON结点中添加ADDRESS元素 

34.     itemelem := xmldom.createElement(doc,'ADDRESS'); 

35.     itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); 

36.     text := xmldom.createTextNode(doc,v_addr); 

37.     itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); 

38.     --PERSON结点中添加TEL元素 

39.     itemelem := xmldom.createElement(doc,'TEL'); 

40.     itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); 

41.     text := xmldom.createTextNode(doc,v_tel); 

42.     itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); 

43.     --PERSON结点中添加FAX元素 

44.     itemelem := xmldom.createElement(doc,'FAX'); 

45.     itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); 

46.     text := xmldom.createTextNode(doc,v_fax); 

47.     itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); 

48.     --PERSON结点中添加EMAIL元素 

49.     itemelem := xmldom.createElement(doc,'EMAIL'); 

50.     itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); 

51.     text := xmldom.createTextNode(doc,v_email); 

52.     itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); 

53.   end addperson; 

54. begin 

55.   --创建一个新DOM文档对像 

56.   doc := xmldom.newDOMDocument; 

57.   --为文档添加根结点PEOPLE 

58.   peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE')); 

59.   ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode); 

60.   --使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中 

61.   for v_row in cur_people loop 

62.     addperson(doc,peoplenode,v_row.personid,v_row.name, 

63.               v_row.address,v_row.tel,v_row.fax,v_row.email); 

64.   end loop; 

65.   --将结果写入指定文件 

66.   xmldom.writeToFile(doc,xmlfile); 

67.   xmldom.freeDocument(doc); 

68. end db2xml;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值