Oracle中解析XMLType格式字段
背景:项目从某数据交换平台获取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格式字段的更多相关文章
- Oracle中对XMLType的简单操作(extract、extractvalue...)
Oracle中对XMLType的简单操作(extract.extractvalue...) 1.下面先创建一个名未test.xml的配置文件. <?xml version="1. ...
- Oracle中的自动增长字段
Oracle中的自动增长字段 Oracle 中不像MYSQL 和MSSQLServer 中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段. 在Or ...
- Oracle中如何查询CLOB字段类型的内容
注:本文来源于:<Oracle中如何查询CLOB字段类型的内容> 语法 select * from table_name where dbms_lob.instr(字段名(clod类型), ...
- Android中解析XML格式数据的方法
XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...
- oracle数据库解析json格式
随着非关系型数据大规模使用,以json格式产生的数据也出现在我所管理的Oracle数据库的CLOB字段里面,使用过程中就需要解析出指定键的值. 使用了最新版本 如果Oracle版本为12.1.0.2的 ...
- Oracle中对XMLType的简单操作(extract、extractvalue)
前几天一直在做Oracle对XMLType字段的操作,我还不是Oracle大拿,到网上找了很多资料,但是很多就是单一功能的介绍,不能很好的解决问题,现在在这里总结下. 1.下面先创建一个名未test. ...
- Oracle中TO_DATE TO_CHAR格式
TO_CHAR 是把日期或数字转换为字符串 TO_DATE 是把字符串转换为数据库中得日期类型转换函数 TO_NUMBER 将字符转化为数字 TO_CHAR 使用TO_CHAR函数处理数字 TO_CH ...
- Oracle中创建自增字段方法
oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: .创建一个表 ) prim ...
- 对于Oracle中Number类型的字段映射成Java中的具体类型的问题
我在Oracle中给一个用户Id字段设置为Number类型,使用JDBC在完成ORM的时候,以为其可以自动转换为Integer,因为我的POJO类id使用的就是Integer.但事实是,我在测试的时候 ...
随机推荐
- Maven实战系列文章目录
Maven实战(一)安装与配置 Maven实战(二)构建简单Maven项目 Maven实战(三)Eclipse构建Maven项目 Maven实战(四)生命周期 Maven实战(五)坐标详解 Maven ...
- 对象在hibernate中的状态
首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load() ...
- Spark系列-核心概念
Spark系列-初体验(数据准备篇) Spark系列-核心概念 一. Spark核心概念 Master,也就是架构图中的Cluster Manager.Spark的Master和Workder节点分别 ...
- 使用阿里云的maven仓库
在maven的settings.xml文件里的mirrors节点,添加如下子节点: <mirror> <id>nexus-aliyun</id> <mirro ...
- virtualbox+vagrant学习-2(command cli)-2-vagrant cloud命令--有问题
Cloud https://www.vagrantup.com/docs/cli/cloud.html 命令: vagrant cloud 这是用来管理与vagrant相关的任何东西的命令. 该命令的 ...
- cmdb截图
- [译]新的CCSDS图像压缩推荐标准
摘要——空间数据系统咨询委员会(CCSDS)的数据压缩工作组最近通过了图像数据压缩议案,最终版本预计在2005年发布.议案中采用的算法由两部分组成,先是一个对图像的二维离散小波变换,然后是对变换后的数 ...
- c++——引用
1 引用概念 a) 在C++中新增加了引用的概念 b) 引用可以看作一个已定义变量的别名 c) 引用的语法:Type& name = var; ...
- C++反汇编代码分析–函数调用
转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include “stdlib.h” int sum(int a,int b,int m,int ...
- MySQL添加、删除索引
1.索引类型 UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值: INDEX(普通索引):允许出现相同的索引内容: PROMARY KEY(主键索引):不允许出现相同的值: fullte ...