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>[email protected]</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>[email protected]</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>[email protected]</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>[email protected]</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 [email protected]
E02 Bill Clinton White House, USA (001) 6400 98765 (001) 6400 98769 [email protected]
E03 Tom Cruise 57 Jumbo Street, New York, USA (001) 4500 67859 (001) 4500 67895 [email protected]
E04 Linda Goodman 78 Crax Lane, London, UK (061) 54 56789 (061) 54 56772 [email protected]
導出的存儲過程:輸入導出路徑就可以了,下面是用來嵌套存儲過程:
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; |