oracle sql操作xml

    当表中某字段是clob类型,保存的是xml格式的信息,如何利用sql来解析xml呢?

 

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

   

<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>

 

 

    方法如下,可以写个function(或者存储过程等)来完成

 

   

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;

 

 

 

  结果如下:

 

 

 

 本文只是简单的示例,只为抛砖引玉,具体请参考资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值