程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> Oracle xml 轉換

Oracle xml 轉換

編輯:關於Oracle數據庫

       select * from pdpla_approve_proj;

      create or replace procedure proj_xml(st_id varchar2)

      is

      pro_rows pdpla_approve_proj%rowtype;--行游標

      tempsql varchar2(100) :='select * from pdpla_approve_proj where st_id='''||st_id||'''';--

      type cur is ref cursor;--自定義游標

      proj_cur cur ;--自定義游標實例

      doc xmldom.DOMDocument := xmldom.newDOMDocument;--文檔對象

      doc_node xmldom.DOMNode := xmldom.makeNode(doc);--文檔節點

      root_ele xmldom.DOMElement := xmldom.createElement(doc,'root');--文檔根元素

      st_pro_ele xmldom.DOMElement;

      project_ele xmldom.DOMElement;

      st_pro_node xmldom.DOMNode;

      root_node xmldom.DOMNode;

      project_node xmldom.DOMNode;

      t_node xmldom.DOMNode;

      cnt number :=1;

      buf varchar2(1000);

      begin

      dbms_output.put_line('tempsql'||tempsql);

      root_node := xmldom.appendChild(doc_node,xmldom.makeNode(root_ele));

      xmldom.setAttribute(root_ele,'id',st_id);

      open proj_cur for tempsql;--打開游標

      loop

      fetch proj_cur into pro_rows;

      exit when proj_cur%notfound;

      project_ele := xmldom.createElement(doc,'project');

      project_node := xmldom.appendChild(root_node,xmldom.makeNode(project_ele));

      st_pro_ele := xmldom.createElement(doc,'st_pro_id');

      st_pro_node := xmldom.appendChild(project_node,xmldom.makeNode(st_pro_ele));

      t_node := xmldom.appendChild(st_pro_node,xmldom.makeNode(xmldom.createTextNode(doc,pro_rows.st_project_id)));

      st_pro_ele := xmldom.createElement(doc,'st_info_type');

      st_pro_node := xmldom.appendChild(project_node,xmldom.makeNode(st_pro_ele));

      t_node := xmldom.appendChild(st_pro_node,xmldom.makeNode(xmldom.createTextNode(doc,pro_rows.st_info_type)));

      cnt :=cnt+1;

      end loop;

      close proj_cur;

      xmldom.writeToBuffer(doc,buf);

      xmldom.freeDocument(doc);

      dbms_output.put_line('cnt'||cnt);

      dbms_output.put_line('doc'||buf);

      exception

      when others then

      dbms_output.put_line('sqlerrm'||sqlerrm);

      end;

      create or replace procedure p_parse (ID in varchar2) is--創建xml解析器實例xmlparser.ParserxmlPar xmlparser.Parser :=xmlparser.newParser;--定義DOM文檔xDoc xmldom.DOMDocument;--定義DATA子節點數目變量lenItme integer;--定義節點列表,存放DATA節點們itemNodes xmldom.DOMNodeList;--定義節點列表,存放DATA子節點們childNodes xmldom.DOMNodeList;--定義節點,存放單個DATA節點itemNode xmldom.DOMNode;--定義屬性變量,存放節點屬性itemArrMap xmldom.DOMNamedNodeMap;--定義其他變量,存放子節點的值name varchar(100);value varchar(100);newid NUMBER(10);--定義clob變量,存放xml字符串para_namexmlStr clob;begin for cur in (select t.xml_data para_name ,t.id from xmldata t where t.id=ID ) --從xmldata表中查詢數據,id不是唯一標識,一個id可查出多條數據(XML中多條數據),故用loop循環 loop --獲取para_name中的xml字符串 xmlStr:=cur.para_name; xmlPar :=xmlparser.newParser; --解析xmlStr中xml字符串,並存放到xmlPar中 xmlparser.parseClob(xmlPar, xmlStr); --將xmlPar中的數據轉存到dom文檔中 xDoc:=xmlparser.getDocument(xmlPar); xmlparser.freeParser(xmlPar); --釋放解析器實例 --獲取所有DATA節點 itemNodes:=xmldom.getElementsByTagName(xDoc,'DATA'); --獲取DATA節點的個數 lenItme :=xmldom.getLength(itemNodes); --遍歷所有的DATA節點 for i in 0..lenItme-1 loop begin --獲取節點列表中的第i個DATA節點 itemNode:=xmldom.item(itemNodes,i); --獲取第i個DATA節點的所有子節點 childNodes:=xmldom.getChildNodes(itemNode); --獲取所有子節點的值 newid:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,0))); name:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,1))); value:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,2))); --將子節點的值newid,name,value存放到xmltest insert into xmltest values(newid,name,value); commit; end; end loop; end loop; --是否dom文檔 xmldom.freeDocument(xDoc); --異常和錯誤處理 EXCEPTION WHEN OTHERS THEN DBMS_output.PUT_LINE(SQLERRM);end p_parse;

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved