oracle sql操作xml

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

 

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

1.

  1. <root>  
  2. <Version id="1">  
  3. <ConfigResource>  
  4.    <Products class="java.util.ArrayList"/>  
  5.    <Properties class="java.util.ArrayList">  
  6.       <Property>  
  7.          <Name>name</Name>  
  8.          <Value><![CDATA[控江]]></Value>  
  9.       </Property>  
  10.       <Property>  
  11.          <Name lang='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. create or replace function fun_gj_xml(xml_content in clob, name in 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.     
  16.   if xml_content is null then  
  17.     return v_result;  
  18.     end if;  
  19.     
  20.   xmlPar := xmlparser.newParser;  
  21.   xmlparser.parseClob(xmlPar,xml_content);  
  22.   doc := xmlparser.getDocument(xmlPar);  
  23.   xmlparser.freeParser(xmlPar);  
  24.   
  25.   tempNodes:=xmldom.getElementsByTagName(doc, 'Name');    -- 获取所有Name标签元素  
  26.   while v_num < xmldom.getLength(tempNodes) loop  
  27.     tempNode:=xmldom.item(tempNodes,v_num);  
  28.     if(xmldom.getNodeValue(xmldom.getFirstChild(tempNode)) = namethen -- 当前遍历Name节点值是否是传进来的name值  
  29.       tempArrMap :=xmldom.getAttributes(tempNode);  
  30.       v_temp :=v_temp || xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'lang')) || ','--获取name=lang的属性值  
  31.         tempNode := xmldom.getNextSibling(tempNode); --Value   获取下一个兄弟元素,即Value标签  
  32.       v_temp := v_temp || xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); --获取Value节点值  
  33.       exit;  
  34.     end if;  
  35.     v_num := v_num+1;  
  36.     end loop;  
  37.       
  38.   v_result := v_temp;  
  39.   return v_result;  
  40. end fun_gj_xml;  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值