Oracle XMLTable 使用教程与实例

从Oracle 10g开始,甲骨文公司新增了XQuery和XMLTable两个功能作为处理XML的武器。 XMLQuery一样,您可以使用XQuery语言构造XML数据和查询XML和关系数据。你可以使用XMLTable从XQuery查询结果创建关系表和列。

本文我们将了解Oracle XMLTable函数,并且通过例子介绍XMLTable函数的用法。
考虑到员工会有一些XML数据,所以我们创建一个EMPLOYEES表:
Create
TABLE EMPLOYEES
(
id
NUMBER,
data
XMLTYPE
)
表创建完成后,我们往表里插入一些数据:
SQL Code
|
1 |
Insert INTO EMPLOYEES |
注意:XML包含了员工的相关数据,在我们开始学习之前我们首先明确几个数据:
1、有4名员工在我们的XML文件
2、每个员工都有通过属性定义一个唯一的员工id emplid
3、每个员工也有一个属性type,定义雇员是否是管理员或用户。
4、每个员工都有四个子节点: firstname , lastname , age和email
5、年龄是多少
现在我们可以使用Oracle XMLTable函数从XML中检索不同的信息。
1、学习XPath表达式
使用XMLTable函数之前最好知道一点关于XPath。XPath使用路径表达式来选择XML文档中的节点或节点列表。看下面的列表:
|
Expression |
Description |
|
nodename |
选择所有名称为"nodename"的节点 |
|
/ |
选择根节点 |
|
// |
从当前节点选择文档中相匹配的节点,无论他们在哪里 |
|
. |
选择当前节点 |
|
.. |
选择当前节点的父节点 |
|
@ |
选择属性 |
|
employee |
选择所有名称为"employee"的节点 |
|
employees/employee |
选择所有子节点为employee的employees节点 |
|
//employee |
选择所有employee的元素,无论他们在哪里 |
下面的表达式称为谓词列表。谓词在方括号中定义 [ ... ]。他们被用来找到一个特定的节点或包含一个特定值的节点。
|
Path Expression |
Result |
|
/employees/employee[1] |
选择第一个employee节点,它是employees的子节点。 |
|
/employees/employee[last()] |
选择最后一个employee元素,它是employees的子节点 |
|
/employees/employee[last()-1] |
选择是employees子元素的倒数第二个employee元素 |
|
//employee[@type='admin'] |
选择所有具有与'admin'的值的属性命名类型的employee元素 |
其他更多的表达式可以参考Oracle官方手册
2、Oracle XMLTable函数的基础知识
读取Employees中所有firstname和lastname
在这个查询中,我们使用XMLTable函数从EMPLOYEES表解析XML内容。
select t.id, x.*
from employees t,
xmltable('/Employees/Employee'
passing t.data columns firstname
varchar2(30)
path
'firstname',
lastname varchar2(30)
path
'lastname') x
where t.id =
1;
注XMLTable函数的语法:
XMLTable('<XQuery>'
PASSING
<xml
column>
COLUMNS
<new
column
name>
<column
type>
PATH
<XQuery path>)
XMLTABLE函数包含一个XQuery行表达式和由一个或多个列表达式组成的COLUMNS子句。在上面的语句中,行表达式是 XPath /Employees/Employee。PASSING子句中的t.data指的是employees表中的XML列中的数据。
COLUMNS 子句用于将XML数据转换成关系数据,这里每个参数都定义了一个列名和SQL数据类型。在上面的查询中,我们定义了firstname 和 lastname列并指向PATH的firstname 和 lastname或者选定的节点。
输出:

使用text()读取节点值
在上面的教程中,我们读取到了firstname / lastname节点。通常我们还需要获取节点的文本值,下面的例子中,我们选取/Employees/Employee/firstname路径,并使用text()获取节点的值。
下面查询employees中所有的firstname
select t.id, x.*
from employees t,
xmltable('/Employees/Employee/firstname'
passing t.data columns
firstname varchar2(30)
path
'text()') x
where t.id =
输出:

不仅仅是text()表达式,Oracle还提供了其他很多有用的表达式,如 item(), node(), attribute(), element(), document-node(), namespace(), text(), xs:integer, xs:string。
读取所选节点的属性
XML节点定了相关属性,我们也可以读取到节点的这些属性,下面的查询是找出employee节点的type属性:
select emp.id, x.*
from employees emp,
xmltable('/Employees/Employee'
passing emp.data columns firstname
varchar2(30)
path
'firstname',
type
varchar2(30)
path
'@type') x;
输出:

使用ID读取特定的记录
select t.id, x.*
from employees t,
xmltable('/Employees/Employee[@emplid=2222]'
passing t.data columns
firstname varchar2(30)
path
'firstname',
lastname varchar2(30)
path
'lastname') x
where t.id =
1;
输出:

读取所有类型是admin的员工的firstname 和 lastname
select t.id, x.*
from employees t,
xmltable('/Employees/Employee[@type="admin"]'
passing t.data columns
firstname varchar2(30)
path
'firstname',
lastname varchar2(30)
path
'lastname') x
where t.id =
1;
输出:

读取年龄超过40的所有员工的firstname 和 lastname
select t.id, x.*
from employees t,
xmltable('/Employees/Employee[age>40]'
passing t.data columns
firstname varchar2(30)
path
'firstname',
lastname varchar2(30)
path
'lastname',
age varchar2(30)
path
'age') x
where t.id =
1;
输出:

本文由UncleToo翻译整理,转载请注明出处!
原文(英文)地址:http://viralpatel.net/blogs/oracle-xmltable-tutorial/
Oracle XMLTable 使用教程与实例的更多相关文章
- Oracle数据仓库创建教程
Oracle数据仓库创建教程.如何创建一个数据仓库,创建实例,以为毕业设计要求,最近开始Oracle的数仓建模实践,详细记录了图形界面下的 Oracle database 12C 数据仓库创建过程. ...
- 创建多个Oracle数据库及相应的实例
转 http://blog.csdn.net/luiseradl/article/details/6972217 对于使用过SQL Server数据库的用户可以会对Oracle中的数据库的实例的概念理 ...
- wxPython中文教程入门实例
这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下 wxPython中文教程入门实例 wx.Window 是一个基类 ...
- ORACLE配置tnsnames.ora文件实例
ORACLE配置tnsnames.ora文件实例客户机为了和服务器连接,必须先和服务器上的监听进程联络.ORACLE通过tnsnames.ora文件中的连接描述符来说明连接信息.一般tnsnames. ...
- Oracle 11g RAC 环境下单实例非缺省监听及端口配置
如果在Oracle 11g RAC环境下使用dbca创建单实例数据库后,Oracle会自动将其注册到缺省的1521端口及监听器.大多数情况下我们使用的为非缺省监听器以及非缺省的监听端口.而且在Orac ...
- Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)
Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...
- Deepin系统手动安装oracle jdk8详细教程
Deepin系统手动安装oracle jdk8详细教程 oracle官网下载jdk压缩包,使用 sudo tar -zxf jdk***解压文件,我放在在了home/diy/java/jdk路径下. ...
- Oracle数据库基础教程
Oracle基础 简介 数据库实例 表空间 登录身份和角色 用户和授权 数据类型 数据操作 导入数据库 一.Oracle基础: 1.简介 Oracle创建数据库不能像SQL Server那样用一个简单 ...
- Flex 布局教程:实例篇【转】
Flex 布局教程:实例篇 作者: 阮一峰 日期: 2015年7月14日 原文:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html ...
随机推荐
- 那些年黑了你的微软BUG
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 炎炎夏日,朗朗乾坤,30℃ 的北京,你还在 Coding 吗? 整个 7 月都在忙项目,还加了 ...
- .net(c#)版RSA加密算法,拿走不谢
今天有同学对接一个支付平台,涉及到RSA的签名和验签.由于对方是java的sdk,翻成c#语言时,搞了半天也没搞定.网上搜的东西都是各种copy还不解决问题. 碰巧,我之前对接过连连银通的网银支付和代 ...
- Vue ES6 Jade Scss Webpack Gulp
一直以来非常庆幸曾经有翻过<代码大全2>:这使我崎岖编程之路少了很多不必要的坎坷.它在软件工艺的话题中有写到一篇:"首先是为人写程序,其次才是机器(Write Programs ...
- Html<a>标签href的困惑记载
近日,在工作中遇到一个小问题(给手游平台做些网页活动,其中牵涉到一个按钮链接,就习以为常的用了A标签,Click响应之后走一段js代码逻辑-弹出一个分享微信弹框.Chrome和Android平台都没问 ...
- T-SQL检查停止的复制作业代理,并启动
有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...
- 前端学HTTP之网站架构演化
前面的话 本文将详细介绍网站架构的演化过程 初始阶段 大型网站都是从小型网站发展而来,网站架构也是一样,是从小型网站架构逐步演化而来.小型网站最开始时没有太多人访问,只需要一台服务器就绰绰有余,这时的 ...
- 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...
- 深入浅出JavaScript之this
JavaScript中的this比较灵活,根据在不同环境下,或者同一个函数在不同方式调用下,this都有可能是不同的.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面是我的学习笔记 ...
- ManualResetEvent知识总结
一. 用法概述 Manual发音:英[ˈmænjuəl] 直译,手动重置事件 开发者的可以手动对线程间的交互进行手动控制. 二.构造函数 构造函数,如果为 true,则将初始状态设置为终止:如果为 f ...
- 实现跨浏览器html5表单验证
div:nth-of-type(odd){ float: left; clear: left; } .origin-effect > div:nth-of-type(even){ float: ...