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 。

 

完!

posted @ 2019-11-25 09:57  壹玖玖肆  阅读(2359)  评论(0编辑  收藏  举报