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>[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.      --獲取第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 [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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章