oracle sql操作xml
阿新 • • 發佈:2019-01-31
當表中某欄位是clob型別,儲存的是xml格式的資訊,如何利用sql來解析xml呢?
oracle自帶強大的xmlPar(function),具體如下:
1.
- <root>
- <Versionid="1">
- <ConfigResource>
- <Productsclass="java.util.ArrayList"/>
- <Propertiesclass="java.util.ArrayList">
- <Property>
- <Name>name</Name>
- <
- </Property>
- <Property>
- <Namelang='cn'>alias</Name>
- <Value><![CDATA[控江-黃興]]></Value>
- </Property>
- <Property>
- <Name>flag</Name>
- <Value><![CDATA[53]]>
- </Property>
- </Properties>
- </ConfigResource>
- </Version>
- </root>
2.儲存過程
- createorreplacefunction fun_gj_xml(xml_content in clob, namein varchar2)
- return varchar2 is
- v_result varchar2(2000);
- v_temp varchar2(2000);
- v_num number;
- xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER; --XML解析器
- doc xmldom.DOMDocument; --DOM文件物件
- tempNodes xmldom.DOMNodeList;
- tempNode xmldom.DOMNode;
- tempArrMap xmldom.DOMNamedNodeMap;
- begin
- v_result := null;
- v_temp := null;
- v_num := 0;
- if xml_content isnullthen
- return v_result;
- end if;
- xmlPar := xmlparser.newParser;
- xmlparser.parseClob(xmlPar,xml_content);
- doc := xmlparser.getDocument(xmlPar);
- xmlparser.freeParser(xmlPar);
- tempNodes:=xmldom.getElementsByTagName(doc, 'Name'); -- 獲取所有Name標籤元素
- while v_num < xmldom.getLength(tempNodes) loop
- tempNode:=xmldom.item(tempNodes,v_num);
- if(xmldom.getNodeValue(xmldom.getFirstChild(tempNode)) = name) then-- 當前遍歷Name節點值是否是傳進來的name值
- tempArrMap :=xmldom.getAttributes(tempNode);
- v_temp :=v_temp || xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'lang')) || ','; --獲取name=lang的屬性值
- tempNode := xmldom.getNextSibling(tempNode); --Value 獲取下一個兄弟元素,即Value標籤
- v_temp := v_temp || xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); --獲取Value節點值
- exit;
- end if;
- v_num := v_num+1;
- end loop;
- v_result := v_temp;
- return v_result;
- end fun_gj_xml;