您的位置:首页 > 数据库 > Oracle

oracle sql操作xml

2015-04-15 12:10 190 查看
当表中某字段是clob类型,保存的是xml格式的信息,如何利用sql来解析xml呢?

oracle自带强大的xmlPar(function),具体如下:

1.

<root>
<Version id="1">
<ConfigResource>
<Products class="java.util.ArrayList"/>
<Properties class="java.util.ArrayList">
<Property>
<Name>name</Name>
<Value><![CDATA[控江]]></Value>
</Property>
<Property>
<Name lang='cn'>alias</Name>
<Value><![CDATA[控江-黄兴]]></Value>
</Property>
<Property>
<Name>flag</Name>
<Value><![CDATA[53]]></Value>
</Property>
</Properties>
</ConfigResource>
</Version>
</root>

2.存储过程

create or replace function fun_gj_xml(xml_content in clob, name in 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 is null then
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: