您的位置:首页 > 数据库 > Oracle

Oracle_导入导出xml

2011-12-20 00:58 295 查看
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. --获取第i个PERSON

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;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: