Oracle XMLTable 使用教程与实例

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

本文我们将了解Oracle?XMLTable函数,并且通过例子介绍XMLTable函数的用法。

考虑到员工会有一些XML数据,所以我们创建一个EMPLOYEES表:

Create
TABLE EMPLOYEES

(

id
NUMBER,

data
XMLTYPE

)

表创建完成后,我们往表里插入一些数据:

?SQL Code?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

?
Insert?INTO?EMPLOYEES
?????VALUES?(1,?xmltype?(‘<Employees>
????<Employee?emplid="1111"?type="admin">
????????<firstname>John</firstname>
????????<lastname>Watson</lastname>
????????<age>30</age>
????????<email>[email protected]</email>
????</Employee>
????<Employee?emplid="2222"?type="admin">
????????<firstname>Sherlock</firstname>
????????<lastname>Homes</lastname>
????????<age>32</age>
????????<email>[email protected]</email>
????</Employee>
????<Employee?emplid="3333"?type="user">
????????<firstname>Jim</firstname>
????????<lastname>Moriarty</lastname>
????????<age>52</age>
????????<email>[email protected]</email>
????</Employee>
????<Employee?emplid="4444"?type="user">
????????<firstname>Mycroft</firstname>
????????<lastname>Holmes</lastname>
????????<age>41</age>
????????<email>[email protected]</email>
????</Employee>
</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 =
1

输出:

不仅仅是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/

时间: 2024-11-05 16:25:10

Oracle XMLTable 使用教程与实例的相关文章

quick-cocos2d-x教程9:实例之加上背景图片

在梳理完quick-cocos2d-x框架的各个目录后,我们开始我们的实例教程,在helloworld后面,加上一张图片,lua编辑器,我用的lua editor,还不错. 我们首先还是参照教程,创建一个game01.命令:create_project -p com.cocos2dlua.game01 -r landscape,这次命令,我加了一个-r,设置为横向的屏幕 用quickplayer 打开game01, 显示helloworld,正常. 然后把game01\scripts目录下的co

室内设计 3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

Oracle PL/SQL 编程基础 实例

create table mytest(name varchar(20),password varchar(30)); create or replace procedure sp_pro2 is begin insert into mytest values('fc','123'); end; 查看错误信息 show error 如何调用该过程: 1, exec 过程名 (参数,..) 2.  call 过程名 (参数  ) set server output on begin dbms_ou

Oracle PL/SQL 编程基础 实例 2

if  循环  控制语句 if--then        endif if----then ----else   endif if-----then --elsif then ----else     endif --编写一个过程,可以 输入一个雇员名,如果该雇员的工资低于2000就给他增加10% create   or replace procedure  sp_pro6(spName varchar2) is v_sal  emp.sal %type; begin select sal in

ORACLE配置tnsnames.ora文件实例

ORACLE配置tnsnames.ora文件实例客户机为了和服务器连接,必须先和服务器上的监听进程联络.ORACLE通过tnsnames.ora文件中的连接描述符来说明连接信息.一般tnsnames.ora 是建立在客户机上的.如果是客户机/服务器结构,整个网络上只有一台机器安装了ORACLE数据库服务器,那么只需在每个要访问ORACLE服务器的客户机上定义该文件,在服务器上无需定义.但是,如果网络上有多台机器均安装了ORACLE数据库服务器,并且服务器之间有数据共享的要求,那么在每台服务器上都

Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)

Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database Ubuntu 12.10 / 12.04 注:原文出自:http://www.techienote.com/tag/oracle-database-11g-r2-on-ubuntu-12-04 Following is the how to for installing Oracle Database

基于RHEL 6.5安装Oracle 11g详细教程(1)&mdash;&mdash;创建虚拟机

前 言 环境说明: 在本次实验当中,主要是实现基于RHEL 6.5 64bit系统成功安装Oracle 11g R2 64bit,实验平台基于VMware vSphere. 介质下载: VMware ESXi 5.5.0(1331820) 下载链接:http://yunpan.cn/QiBnp2xxpFjaD 访问密码 2ec0 Redhat Enterprise Linux 6.5 x86_64 下载链接:http://yunpan.cn/QiBXcFF5SXvBj 访问密码 467f Ora

基于RHEL 6.5安装Oracle 11g详细教程(2)&mdash;&mdash;安装RHEL6.5

2  安装RHEL 6.5 1)如下图所示,选择Oracle虚拟机,在Oracle虚拟机上点击右键,依次选择电源--打开电源(或使用Ctrl+B组合键). 2)如下图所示,在Oracle虚拟机上点击右键,选择打开控制台. 3)如下图所示,依次选择虚拟机CD/DVD设备--CD/DVD驱动器1--连接到本地磁盘上的ISO映像. 4)如下图所示,选择RHEL 6.5的ISO文件(rhel-server-6.5-x86_64-dvd.iso),单击打开. 5)如下图所示,依次选择虚拟机CD/DVD设备

基于RHEL 6.5安装Oracle 11g详细教程(3)&mdash;&mdash;安装VMware Tools

3  安装VMware Tools 1)如下图所示,依次选择虚拟机 -- 客户机 -- 安装/升级VMware Tools. 2)如下图所示,单击确定. 3)如下图所示,单击确定. 4)如下图所示,可以看到VMware Tools的安装介质. 5)如下图所示,在VMware Tools目录内点击右键选择Open in Terminal. 6)如下图所示,Terminal已经打开. [[email protected] VMware Tools]# ls manifest.txt VMwareTo