隨筆-14  評論-34  文章-0  trackbacks-0
          需要解析的xml文件:people.xml
           1 <?xml version="1.0"?>
           2 <PEOPLE>
           3     <PERSON PERSONID="E01">
           4         <NAME>Tony Blair</NAME>
           5         <ADDRESS>10 Downing Street, London, UK</ADDRESS>
           6         <TEL>(061) 98765</TEL>
           7         <FAX>(061) 98768</FAX>
           8         <EMAIL>blair@everywhere.com</EMAIL>
           9     </PERSON>
          10     <PERSON PERSONID="E02">
          11         <NAME>Bill Clinton</NAME>
          12         <ADDRESS>White House, USA</ADDRESS>
          13         <TEL>(001) 6400 98765</TEL>
          14         <FAX>(001) 6400 98769</FAX>
          15         <EMAIL>bill@everywhere.com</EMAIL>
          16     </PERSON>
          17     <PERSON PERSONID="E03">
          18         <NAME>Tom Cruise</NAME>
          19         <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
          20         <TEL>(001) 4500 67859</TEL>
          21         <FAX>(001) 4500 67895</FAX>
          22         <EMAIL>cruise@everywhere.com</EMAIL>
          23     </PERSON>
          24     <PERSON PERSONID="E04">
          25         <NAME>Linda Goodman</NAME>
          26         <ADDRESS>78 Crax Lane, London, UK</ADDRESS>
          27         <TEL>(061) 54 56789</TEL>
          28         <FAX>(061) 54 56772</FAX>
          29         <EMAIL>linda@everywhere.com</EMAIL>
          30     </PERSON>
          31 </PEOPLE>

          我以scott用戶為例,新建表:
          1 CREATE TABLE PEOPLE
          2 (
          3   PERSONID VARCHAR2(4PRIMARY KEY,
          4   NAME VARCHAR2(50),
          5   ADDRESS VARCHAR2(200),
          6   TEL VARCHAR2(20),
          7   FAX VARCHAR2(20),
          8   EMAIL VARCHAR2(100)
          9 );

          假設(shè)表里面已經(jīng)有數(shù)據(jù),如果想從XML插入數(shù)據(jù)請看【原創(chuàng)】編寫Oracle存儲過程解析XML,并把數(shù)據(jù)持久化

          以下是把查詢結(jié)果生成XML文件的存儲過程代碼:
           1 /**
           2 *sqlStr        附加的查詢條件 如:where PERSONID = 'E01',查詢所有輸入''
           3 *file_path     文件保存路徑   如:D:\OracleTest\outpeople.xml
           4 **/
           5 CREATE OR REPLACE PROCEDURE OUTPUTPEOPLE(sqlStr VARCHAR2,file_path VARCHAR2)
           6 AS
           7     personRow PEOPLE%ROWTYPE;      --獲取游標(biāo)的行變量
           8     TYPE person_cur IS REF CURSOR--自定義REF游標(biāo)
           9     cur person_cur;    
          10     tempSql varchar2(500) := 'SELECT * FROM PEOPLE ';       --初始的查詢語句
          11     doc xmlDom.DOMDocument := xmldom.newDOMDocument;        -- 創(chuàng)建文檔對象
          12     main_node xmlDom.DOMNode := xmldom.makeNode(doc);       -- 獲得文檔節(jié)點
          13     root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, 'PEOPLE');   -- 創(chuàng)建根元素
          14     --==================================================
          15     --以下定義元素
          16     person_elmt xmlDom.DOMElement;      --定義PERSON元素
          17     name_elmt xmlDom.DOMElement;      --定義NAME元素
          18     address_elmt xmlDom.DOMElement;      --定義ADDRESS元素
          19     tel_elmt xmlDom.DOMElement;           --定義TEL元素    
          20     email_elmt xmlDom.DOMElement;      --定義EMAIL元素    
          21     --==================================================
          22     --以下定義節(jié)點
          23     root_node xmlDom.DOMNode;   --定義PEOPLE節(jié)點
          24     person_node xmlDom.DOMNode;   --定義PERSON節(jié)點
          25     name_node xmlDom.DOMNode;   --定義NAME節(jié)點
          26     address_node xmlDom.DOMNode;   --定義ADDRESS節(jié)點
          27     tel_node xmlDom.DOMNode;   --定義TEL節(jié)點
          28     email_node xmlDom.DOMNode;   --定義EMAIL節(jié)點
          29     temp_node xmlDom.DOMNode;
          30 BEGIN
          31     -- 向文檔節(jié)點加入根節(jié)點:<PEOPLE></PEOPLE>
          32     root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
          33     --附加查詢條件
          34     tempSql := tempSql||sqlStr;
          35     --打開游標(biāo)
          36     OPEN cur FOR tempSql;
          37     --遍歷游標(biāo)
          38     LOOP
          39       FETCH cur INTO personRow;
          40       EXIT WHEN cur%NOTFOUND;
          41       --===========================================================================--
          42       person_elmt := xmldom.createElement(doc, 'PERSON'); --創(chuàng)建PERSON元素
          43       -- 向PEOPLE節(jié)點加入PERSON節(jié)點<PERSON></PERSON>
          44       person_node := xmldom.appendChild(root_node, xmldom.makeNode(person_elmt));
          45       --===========================================================================--
          46       --向PERSON節(jié)點加入屬性PERSONID
          47       xmlDom.SETATTRIBUTE( person_elmt, 'PERSONID', personRow.personId );
          48       --===========================================================================--
          49       name_elmt := xmldom.createElement(doc, 'NAME');      --創(chuàng)建NAME元素
          50       --向PERSON節(jié)點加入子節(jié)點NAME
          51       name_node := xmldom.appendChild(person_node,xmlDom.makeNode(name_elmt));
          52       --向NAME節(jié)點加入文本
          53       temp_node := xmldom.appendChild(name_node , xmlDom.makeNode(xmldom.createTextNode(doc,personRow.name)));
          54       --===========================================================================--
          55       address_elmt := xmldom.createElement(doc, 'ADDRESS');      --創(chuàng)建ADDRESS元素
          56       --向PERSON節(jié)點加入子節(jié)點ADDRESS
          57       address_node := xmldom.appendChild(person_node,xmlDom.makeNode(address_elmt));
          58       --向ADDRESS節(jié)點加入文本
          59       temp_node := xmldom.appendChild(address_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.address)));
          60       --===========================================================================--
          61       tel_elmt := xmldom.createElement(doc, 'TEL');      --創(chuàng)建TEL元素    
          62       --向TEL節(jié)點加入子節(jié)點NAME
          63       tel_node := xmldom.appendChild(person_node,xmlDom.makeNode(tel_elmt));
          64       --向TEL節(jié)點加入文本
          65       temp_node := xmldom.appendChild(tel_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.tel)));
          66       --===========================================================================--
          67       email_elmt := xmldom.createElement(doc, 'EMAIL');      --創(chuàng)建EMAIL元素    
          68       --向PERSON節(jié)點加入子節(jié)點EMAIL
          69       email_node := xmldom.appendChild(person_node,xmlDom.makeNode(email_elmt));
          70       --向EMAIL節(jié)點加入文本
          71       temp_node := xmldom.appendChild(email_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.email)));
          72       --===========================================================================--
          73     END LOOP;
          74     CLOSE cur;
          75     --寫入硬盤
          76     xmlDom.writeToFile(doc,file_path,'GBK');
          77   EXCEPTION
          78    WHEN OTHERS THEN
          79      DBMS_output.PUT_LINE(SQLERRM);
          80 END OUTPUTPEOPLE;





          posted on 2008-03-19 21:48 Jam Chan 閱讀(3063) 評論(3)  編輯  收藏 所屬分類: Oracle

          評論:
          # re: 【原創(chuàng)】編寫Oracle存儲過程,按照條件把數(shù)據(jù)導(dǎo)出至XML文件[未登錄] 2008-12-07 20:38 | 過客
          為何我報的錯誤為invalid char in text  回復(fù)  更多評論
            
          # re: 【原創(chuàng)】編寫Oracle存儲過程,按照條件把數(shù)據(jù)導(dǎo)出至XML文件[未登錄] 2008-12-07 20:40 | 過客
          我寫的代碼如下: (pid number,file_path varchar2)
          is
          doc xmlDom.DOMDocument := xmldom.newDOMDocument; -- 創(chuàng)建文檔對象
          main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 獲得文檔節(jié)點
          root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, 'PEOPLE'); -- 創(chuàng)建根元素
          person_elmt xmlDom.DOMElement; --定義PERSON元素
          name_elmt xmlDom.DOMElement; --定義NAME元素
          qyjs_elmt xmlDom.DOMElement; --定義QYJS元素
          filename_elmt xmlDom.DOMElement; --定義filename元素
          root_node xmlDom.DOMNode; --定義PEOPLE節(jié)點
          person_node xmlDom.DOMNode; --定義PERSON節(jié)點
          name_node xmlDom.DOMNode; --定義NAME節(jié)點
          qyjs_node xmlDom.DOMNode; --定義qyjs節(jié)點
          filename_node xmlDom.DOMNode; --定義filename節(jié)點
          temp_node xmlDom.DOMNode;

          v_name varchar2(64);
          v_qyjs varchar2(500);
          v_filename varchar2(200);
          begin
          SELECT NAME INTO v_name FROM FILIALE WHERE ID=pid;
          SELECT QYJS INTO v_qyjs FROM FILIALE WHERE ID=pid;
          SELECT OFILENAME INTO v_filename FROM FILIALE WHERE ID=pid;
          --生成xml文檔
          -- 向文檔節(jié)點加入根節(jié)點:<PEOPLE></PEOPLE>
          root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));

          person_elmt := xmldom.createElement(doc, 'PERSON'); --創(chuàng)建PERSON元素
          -- 向PEOPLE節(jié)點加入PERSON節(jié)點<PERSON></PERSON>
          person_node := xmldom.appendChild(root_node, xmldom.makeNode(person_elmt));

          --向PERSON節(jié)點加入屬性PERSONID
          xmlDom.SETATTRIBUTE( person_elmt, 'PERSONID', pid );

          name_elmt := xmldom.createElement(doc, 'NAME'); --創(chuàng)建NAME元素
          --向PERSON節(jié)點加入子節(jié)點NAME
          name_node := xmldom.appendChild(person_node,xmlDom.makeNode(name_elmt));

          --向NAME節(jié)點加入文本
          temp_node := xmldom.appendChild(name_node , xmlDom.makeNode(xmldom.createTextNode(doc,v_name)));

          qyjs_elmt := xmldom.createElement(doc, 'QYJS'); --創(chuàng)建qyjs元素
          --向PERSON節(jié)點加入子節(jié)點qyjs
          qyjs_node := xmldom.appendChild(person_node,xmlDom.makeNode(qyjs_elmt));
          --向qyjs節(jié)點加入文本
          temp_node := xmldom.appendChild(qyjs_node,xmlDom.makeNode(xmldom.createTextNode(doc,v_qyjs)));

          filename_elmt := xmldom.createElement(doc, 'FILENAME'); --創(chuàng)建filename元素
          --向filename節(jié)點加入子節(jié)點filename
          filename_node := xmldom.appendChild(person_node,xmlDom.makeNode(filename_elmt));
          --向filename節(jié)點加入文本
          temp_node := xmldom.appendChild(filename_node, xmlDom.makeNode(xmldom.createTextNode(doc,v_filename)));

          --寫入硬盤
          xmldom.setVersion(doc, '1.0 ');
          xmlDom.writeToFile(doc,file_path,'GBK');
          EXCEPTION
          WHEN OTHERS THEN
          ROLLBACK;
          end CJXML;
          為何報invalid char in text   回復(fù)  更多評論
            
          # re: 【原創(chuàng)】編寫Oracle存儲過程,按照條件把數(shù)據(jù)導(dǎo)出至XML文件 2009-03-22 22:42 | ljjhxyljj
          這個例子是不是不能在oracle8i中通過?  回復(fù)  更多評論
            
          主站蜘蛛池模板: 锡林郭勒盟| 武邑县| 宕昌县| 都昌县| 和田县| 栾川县| 炉霍县| 方正县| 泾阳县| 行唐县| 郎溪县| 耒阳市| 富平县| 杭锦旗| 克拉玛依市| 偃师市| 怀远县| 大宁县| 苏尼特左旗| 靖江市| 隆尧县| 咸阳市| 新宁县| 娱乐| 长武县| 黄冈市| 湖南省| 桦南县| 贵定县| 苍山县| 大城县| 栖霞市| 徐闻县| 嘉禾县| 江安县| 文登市| 阿克陶县| 江孜县| 内丘县| 高邮市| 章丘市|