1. 程式人生 > >oracle sql操作xml

oracle sql操作xml

當表中某欄位是clob型別,儲存的是xml格式的資訊,如何利用sql來解析xml呢?

    oracle自帶強大的xmlPar(function),具體如下:

1.

  1. <root>
  2. <Versionid="1">
  3. <ConfigResource>
  4.    <Productsclass="java.util.ArrayList"/>
  5.    <Propertiesclass="java.util.ArrayList">
  6.       <Property>
  7.          <Name>name</Name>
  8.          <
    Value><![CDATA[控江]]></Value>
  9.       </Property>
  10.       <Property>
  11.          <Namelang='cn'>alias</Name>
  12.          <Value><![CDATA[控江-黃興]]></Value>
  13.       </Property>
  14.       <Property>
  15.          <Name>flag</Name>
  16.          <Value><![CDATA[53]]>
    </Value>
  17.       </Property>
  18.    </Properties>
  19. </ConfigResource>
  20. </Version>
  21. </root>

2.儲存過程

  1. createorreplacefunction fun_gj_xml(xml_content in clob, namein varchar2)  
  2.   return varchar2 is
  3.   v_result varchar2(2000);  
  4.   v_temp varchar2(2000);  
  5.   v_num number;  
  6.   xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;   --XML解析器
  7.   doc xmldom.DOMDocument;  --DOM文件物件
  8.   tempNodes xmldom.DOMNodeList;  
  9.   tempNode xmldom.DOMNode;  
  10.   tempArrMap xmldom.DOMNamedNodeMap;  
  11. begin
  12.   v_result := null;  
  13.   v_temp := null;  
  14.   v_num := 0;  
  15.   if xml_content isnullthen
  16.     return v_result;  
  17.     end if;  
  18.   xmlPar := xmlparser.newParser;  
  19.   xmlparser.parseClob(xmlPar,xml_content);  
  20.   doc := xmlparser.getDocument(xmlPar);  
  21.   xmlparser.freeParser(xmlPar);  
  22.   tempNodes:=xmldom.getElementsByTagName(doc, 'Name');    -- 獲取所有Name標籤元素
  23.   while v_num < xmldom.getLength(tempNodes) loop  
  24.     tempNode:=xmldom.item(tempNodes,v_num);  
  25.     if(xmldom.getNodeValue(xmldom.getFirstChild(tempNode)) = namethen-- 當前遍歷Name節點值是否是傳進來的name值
  26.       tempArrMap :=xmldom.getAttributes(tempNode);  
  27.       v_temp :=v_temp || xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'lang')) || ','--獲取name=lang的屬性值
  28.         tempNode := xmldom.getNextSibling(tempNode); --Value   獲取下一個兄弟元素,即Value標籤
  29.       v_temp := v_temp || xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); --獲取Value節點值
  30.       exit;  
  31.     end if;  
  32.     v_num := v_num+1;  
  33.     end loop;  
  34.   v_result := v_temp;  
  35.   return v_result;  
  36. end fun_gj_xml;