背景:项目从某数据交换平台获取XML数据,以Oracle的XMLType格式保存在数据库字段中,需要建立触发器、存储过程,在保存数据时解析XML字段,将数据写入其他业务表中。

参考资料:Oracle的XMLType操作文档,地址为https://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb04cre.htm#sthref465

要点总结:

(一)使用SQL语句操作XMLType格式字段的3个主要方法

  (1)existsNode(XMLType实例,XPATH表达式)

  1.功能:

  需要用在where条件中,通过XPATH表达式在传入的XMLType实例中进行查询,如果实例中有符合表达式的节点,则函数返回1,否则返回0

  2.使用方法:

  select * from loginkcn_maritime_manifest where existsNode(xml,'/Root/Header/DocumentName')=1 and id='0272AB47DEDD450FBD06CA07463F245A';

  函数中的"xml"为保存XMLType数据的字段名,id为普通varchar2字段,此时existsNode作为where条件的一项来使用,可以筛选出表中的记录

  (2)extract(XMLType实例,XPATH表达式)

  1.功能:

  需要用在select之后,from之前,用于对查询出的XMLType字段的值进行进一步提取,从而获得新的XMLType格式的结果

  2.使用方法:

  select extract(xml,'/Root/Body/ContainerInfo') from loginkcn_maritime_manifest where existsNode(xml,'/Root/Header/DocumentName')=1 and                       id='0272AB47DEDD450FBD06CA07463F245A';

  在通过existsNode()方法筛选出记录的基础上,通过extract方法提取出Root节点下,Body子节点中所有ContainerInfo节点的信息,作为一个新的XMLType类型的结果值

  3.注意:

  如果在存储过程中,可以传入一个XMLType的变量,此时只需要使用select extract('传入的XMLType变量','XPATH表达式') into '提取出的XMLType变量' from dual;的形式,来将传入的变量进一步进行提取并保存到新的变量中。

  得到的新的XMLType结果可以应用到之后的进一步操作中。

  (3)extractValue(XMLType实例,XPATH表达式)

  1.功能:extractValue()方法和extract()方法类似,只不过得到数据类型的是节点的具体值,而不是XML节点类型,相当于extract.getStringVal(),通过此方法可以直接得到具体节点值,用来进行下一步操作,如insert到其他表中,此方法是最为常用的方法。

  2.使用方法:

  select extractValue(xml,'/Root/Body/ContainerInfo/ContainerNumber[1]') from loginkcn_maritime_manifest where existsNode(xml,'/Root/Header/DocumentName')=1 and                id='0272AB47DEDD450FBD06CA07463F245A';

  3.注意:

  此方法只能提取出单个节点的值,不能同时提取多个相同节点的值。

  如果要一个节点中有多个重复的子节点,则需要通过XMLSquence转化先将XMLType数据转换为Table,然后才能以表的形式获取所有的子节点值,进而使用到游标循环等操作中(详细使用见下方)。

(二)对提取出的XML数据进行转换的2种方法

  (1)XMLSequence(XMLType实例)

  1.功能:

  XMLSequence接收一个XMLType实例(可以用extract函数从数据库中导出并提取),按照实例中的顶层节点返回一个XMLType数组。配合Oracle的table()函数,可以将XMLType数组按照表的形式进行查询,然后可以进行count(*)、使用游标循环等操作。

  2.使用方法:

  select count(*) from table(XMLSequence(extract((select xml from loginkcn_maritime_manifest where        id='0272AB47DEDD450FBD06CA07463F245A'),'/Root/Body/ContainerInfo/ContainerNumber')));

  3.注意:

  XMLSequence需要和table()函数组合使用,效果和XMLTable类似

  table函数的应用 表函数可接受查询语句或游标作为输入参数,并可输出多行数据

  (2)XMLTable('XPATH表达式' passing 所在表的XMLType列

          columns 列名  类型   path  XPATH表达式)

  1.功能  

  使用XMLTable可以方便的将XMLType字段转换为表格形式来进行下一步的操作

  此函数将传入的XMLType列用XPATH表达式过滤后,按照columns定义的列规则,将节点和字段对应起来构成表格

  2.使用方法:

  select t.id,x.* from loginkcn_maritime_manifest t,xmltable(
    '/Root/Body/ContainerInfo/ContainerNumber' passing t.xml
    columns container_number varchar2(30) path 'text()'
  ) x where t.id='0272AB47DEDD450FBD06CA07463F245A';

  3.注意:

  转换时要注意XML的格式要符合DTD标准

  配合XPATH表达式可以实现更加复杂的筛选逻辑,如按照属性值进行筛选

Oracle中解析XMLType格式字段的更多相关文章

  1. Oracle中对XMLType的简单操作(extract、extractvalue...)

    Oracle中对XMLType的简单操作(extract.extractvalue...)    1.下面先创建一个名未test.xml的配置文件. <?xml version="1. ...

  2. Oracle中的自动增长字段

    Oracle中的自动增长字段 Oracle 中不像MYSQL 和MSSQLServer 中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段. 在Or ...

  3. Oracle中如何查询CLOB字段类型的内容

    注:本文来源于:<Oracle中如何查询CLOB字段类型的内容> 语法 select * from table_name where dbms_lob.instr(字段名(clod类型), ...

  4. Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  5. oracle数据库解析json格式

    随着非关系型数据大规模使用,以json格式产生的数据也出现在我所管理的Oracle数据库的CLOB字段里面,使用过程中就需要解析出指定键的值. 使用了最新版本 如果Oracle版本为12.1.0.2的 ...

  6. Oracle中对XMLType的简单操作(extract、extractvalue)

    前几天一直在做Oracle对XMLType字段的操作,我还不是Oracle大拿,到网上找了很多资料,但是很多就是单一功能的介绍,不能很好的解决问题,现在在这里总结下. 1.下面先创建一个名未test. ...

  7. Oracle中TO_DATE TO_CHAR格式

    TO_CHAR 是把日期或数字转换为字符串 TO_DATE 是把字符串转换为数据库中得日期类型转换函数 TO_NUMBER 将字符转化为数字 TO_CHAR 使用TO_CHAR函数处理数字 TO_CH ...

  8. Oracle中创建自增字段方法

    oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: .创建一个表 ) prim ...

  9. 对于Oracle中Number类型的字段映射成Java中的具体类型的问题

    我在Oracle中给一个用户Id字段设置为Number类型,使用JDBC在完成ORM的时候,以为其可以自动转换为Integer,因为我的POJO类id使用的就是Integer.但事实是,我在测试的时候 ...

随机推荐

  1. 【Alpha】Daily Scrum Meeting——blog2

    团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 忘记拍了!(没有拍照片的习惯,没有第四人拍照) 2. 每个人 ...

  2. Redis与高级语言内置的数据结构相比的异同及优势

    相关链接: 为什么要用redis而不用map做缓存? Redis的数据结构及应用场景 Redis缓存和直接使用内存的比较 Java自带的数据结构(如HashMap,BitSet等)做缓存和NoSQL( ...

  3. datagrid 完整dom结构

    <!-- datagrid的最外层容器,可以使用$(target).datagrid('getPanel')或者$.data(target,'datagrid').panel得到这个DOM对象, ...

  4. C++矩阵库 Eigen 简介

    最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...

  5. jQuery选择器(上)

    一.基本选择器  1.ID选择器 $("#id")  2.类选择器 $(".class")  3.元素选择器 $("element")  4 ...

  6. 在Mac检查安装的.net core 版本

    在 Termianl which dotnet #查看dotnetcore的runtime路径 dotnet #dotnet 命令行工具 -h 查看帮助 #常用命令 # --info Display ...

  7. 关于<button> 没写 type='button' 导致点击时提交以及<button>和<input type="button">的区别

    这是我的第一篇博客,如果写的不好,请见谅 这是一个关于button按钮一个小问题 最近刚开学跟着老师一起写代码,在模仿JAVA web程序设计(慕课版) P61页第三章 Ajax处理XML的代码中发现 ...

  8. 达梦数据库DM7小结

    除了很多主流的数据库,我们很熟悉之外,越来越多的国产数据库也涌现出来. 这次就小结一些有关武汉的达梦数据库7这个开发版数据库的有别或者需要注意的地方进行一个简单备注吧. 1.第一件大事就是下载.数据库 ...

  9. 不安分的android开发者(小程序初尝试,前后台都自己做)

    前言 作为一个稍微有点想法的程序员来说,拥有一个自己开发,自己运营,完全属于自己的应用,应该是很多人的梦想.刚毕业那会,自己的工作是做游戏,于是也和朋友业余时间开发一些小游戏玩玩,可是终究不成气候,而 ...

  10. 用margin实现两列布局中的自适应列

    <div id="wrapper"> <div id="col1"> "fixed" </div> &l ...