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 ...
随机推荐
- ABP源码分析十一:Timing
Timing这个简单实用的功能主要用于以统一的方式表示时间.因为ABP中有大量的module,还支持自定义module,所以将时间统一表示为local时间(默认)或utc时间是必要的. IClockP ...
- Python3 登陆网页并保持cookie
网页登陆 网页登陆的原理都是,保持一个sessionid在cookie然后,根据sessionid在服务端找到cookie进行用户识别 python实现 由于python的简单以及丰富的类库是开发网络 ...
- 读取xml数据装配到字典中
public Dictionary<string, string> GetXml() { Dictionary<string, string> dic = new Dictio ...
- [3D数学基础:图形与游戏开发]专栏前言
期待的书终于到了,接下来我会把自己的学习笔记以及心得整理出来,形成专栏,每一章都进行记录和学习总结,今天是2016年12月30日,再过一天就是元旦了,就要迎来美好的2017年了!!!加油~ 上面的书就 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
缓存融合技术和主要后台进程(四) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- Python笔记之不可不知
Python软件已经安装成功有很长一段时间了,也即或多或少的了解Python似乎也很长时间了,也是偏于各种借口,才在现在开始写点总结.起初接触Python是因为公司项目中需要利用Python来测试开发 ...
- Vue.js学习笔记(1)
数据的双向绑定(ES6写法) 效果: 没有改变 input 框里面的值时
- FFmpeg数据结构:AVPacket解析
本文主要从以下几个方面对AVPacket做解析: AVPacket在FFmpeg中的作用 字段说明 AVPacket中的内存管理 AVPacket相关函数的说明 结合AVPacket队列说明下AVPa ...
- 基于HTML5的WebGL应用内存泄露分析
上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...
- 使用F#开发ASP.NET Core应用程序
.NET Core 里的F# 在.NET Core刚发布时,就已经添加了对F#的支持.但因为当时F#组件还不完整,而一些依赖包并没有放在Nuget上,而是社区自己放到MyGet上,所以在使用dotne ...