zoukankan      html  css  js  c++  java
  • Oracle数据库 获取CLOB字段存储的xml格式字符串指定节点的值

    参照: Oracle存储过程中使用游标来批量解析CLOB字段里面的xml字符串

      背景:在写存储过程时,需要获取表单提交的信息。表单信息是以xml格式的字符串存储在colb类型的字段dataxml中,如何获取呢?参考百度内容,写一个function(函数),参数有xml格式字符串(dataxml值)和指定节点(nodeName),返回指定节点的值(nodeValue)。

      编码实现

    --get_xml_nodeValue实现 start

    CREATE OR REPLACE FUNCTION get_xml_nodeValue(xmlStr CLOB, nodeName VARCHAR2) RETURN VARCHAR2 IS

      --创建xml解析器实例xmlparser.Parser
      xmlPar xmlparser.Parser := xmlparser.newParser;

      --定义DOM文档
      xDoc xmldom.DOMDocument;

      --定义item子节点数目变量
      lenItme INTEGER;

      --定义节点列表,存放item节点们
      itemNodes xmldom.DOMNodeList;

      --定义节点,存放单个item节点
      itemNode xmldom.DOMNode;

      valueReturn VARCHAR2 (100);

    BEGIN

      --解析xmlStr中xml字符串,并存放到xmlPar中
      xmlparser.parseClob(xmlPar, xmlStr);

      --将xmlPar中的数据转存到dom文档中
      xDoc := xmlparser.getDocument(xmlPar);

      --释放解析器实例
      xmlparser.freeParser(xmlPar);

      --获取所有item节点
      itemNodes := xmldom.getElementsByTagName(xDoc, nodeName);

      --获取item节点的个数
      lenItme := xmldom.getLength(itemNodes);

      --如果无该标签,则返回EMPTY
      IF lenItme = 0 THEN

        valueReturn := '';

      ELSE

        --获取节点列表中的第1个item节点
        itemNode := xmldom.item (itemNodes, 0);

        --获取所有子节点的值
        valueReturn := xmldom.getNodeValue(xmldom.getFirstChild (itemNode));

      END IF;

      --释放dom
      xmldom.freeDocument(xDoc);

      RETURN valueReturn;

    END get_xml_nodeValue;

    --get_xml_nodeValue实现 end

      调用测试

      表:FORM_DATA;

      字段:DATAXML,字段值:“<data><id>1</id><name>张三</name><phone>17700000000</phone><id_number>410527999909099999</id_number></data>”;

      查询1:select get_xml_nodeValue(f.dataxml, 'name') from form_data f; 结果:张三 ;

      查询2:select get_xml_nodeValue(f.dataxml, 'phone') from form_data f; 结果:17700000000 ;

      查询3:select get_xml_nodeValue(f.dataxml, 'id_number') from form_data f; 结果:410527999909099999 。

    完!

  • 相关阅读:
    阿里云centos7.2自己安装mysql5.7远程不能访问解决方案
    Delphi中的线程类
    简单说说Delphi中线程的释放
    delphi杀进程的两种方式
    delphi备份恢复剪切板(使用了GlobalLock API函数和CopyMemory)
    Delphi 7下使用Log4Delphi 0.8日志组件
    Demo+在Linux下运行(CentOS7+dotnetcore sdk)
    反射
    解析表达式树
    JS面向对象编程之:封装、继承、多态
  • 原文地址:https://www.cnblogs.com/zcx-94/p/11913223.html
Copyright © 2011-2022 走看看