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文件到数据表中的存储过程:
执行存储过程:
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
导出的存储过程:输入导出路径就可以了,下面是用来嵌套存储过程:
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; |
相关文章推荐
- oracle 11g 含xmlType类型表的导入导出
- 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
- 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
- C#实现Oracle到XML的导入导出
- Oracle 导出导入XML
- 在Oracle表数据和xml文件间相互导入导出
- 解决 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- Oracle数据导入导出详解
- atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
- Oracle数据库:impdp导入数据库及expdp导出数据过程详解
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
- Oracle 创建表空间,用户,授权,导入,导出
- Oracle中用exp/imp命令快速导入导出数据
- 关于oracle dos下导入和导出
- 异平台异版本oracle数据导入导出
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- Oracle数据导入导出imp/exp
- oracle数据库备份(2)——Oracle 的数据导出导入命令:exp、imp
- 将 从oracle 11g 导出的 dmp 文件, 导入到 oracle 10g中出现的文件同步验证