oracle+xquery函数,Oracle XQuery查询、构建和转换XML(2)
查询 Oracle XML DB 信息库中的 XML 数据
为访问 Oracle XML DB 信息库中存储的 XML 数据,Oracle XQuery 引入了 fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您可以查询 XML 信息库中存储的单个 XML 文档,而 fn:collection 使您可以访问同一信息库文件夹中存储的多个 XML 文档。
正如本文之前(参阅使用关系数据构建 XML部分)介绍的示例所演示,使用 fn:doc 非常简单直接。它获取表示信息库文件资源 (URI) 的字符串并返回该 URI 指向的文档。要了解 fn:collection XQuery 函数的作用,同一文件夹中至少应有两个信息库文件。如果已经运行了列表 1 中的代码,则已经创建了 /public/employees 信息库文件夹并在其中存储了 employees.xml 文件。因此,您将需要在该文件夹中至少再创建一个 XML 文件,然后才能试用 fn:collection。列表 2 中的 PL/SQL 代码基于 SCOTT/TIGER 演示数据库模式的 dept 和 emp 表存储的关系数据构建 XML,然后将生成的 XML 文档作为 acc_dept.xml 保存到 /public/employees 信息库文件夹。要运行列表 2 中的 PL/SQL 过程,请确保以 SCOTT/TIGER 的身份登录。
列表 2:基于关系数据构建 XML 并将其保存到 XML 信息库
DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in ora:view("SCOTT", "dept")/ROW
where $j/DEPTNO = 10
return ({$j/DEPTNO,
$j/DNAME}
{
for $i in ora:view("SCOTT", "emp")/ROW
where $i/DEPTNO = $j/DEPTNO
return (
{$i/EMPNO,
$i/ENAME,
$i/SAL})})'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/acc_dept.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/
此时,/public/employees 信息库文件夹应包含两个文件:acc_dept.xml(由列表 2 中的 PL/SQL 代码生成)和 employees.xml 文件(由列表 1 中的代码生成)。由于这些 XML 文档存储在同一信息库文件夹中,因此可以使用 fn:collection 函数访问两个 XML 文档中存储的员工信息。然而,尽管这些 XML 文档均包含员工 XML 元素(这些元素实际上具有相同结构),但 XML 文档本身的结构迥然不同。在 employees.xml 中,文档根元素为 EMPLOYEES,而 acc_dept.xml 将 DEPARTMENT 用作根元素。要解决此问题,可以通过 XQuery 使用 XPath // 构造,从而导航到 XML 文档中的某个节点,而不必指定该节点的确切路径。以下示例演示了如何在 XQuery 表达式中使用 XPath // 构造:
SELECT XMLQuery(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
order by $i/ENAME
return;
$i'
RETURNING CONTENT) FROM DUAL;
该构造应生成以下输出:
102
De Haan
17000
7839
KING
5000
100
King
24000
101
Kochhar
17000
您可以看到,以上输出包含从 employees.xml 和 acc_dept.xml 中获取的员工 XML 元素,这些元素表示薪酬大于或等于 5,000 美元的员工。
将 XML 分解为关系数据
如果应用程序处理关系数据而非 XML,而您需要访问的数据以 XML 格式存储,则将 XML 分解为关系数据可能会非常有用。继续进行上一部分的示例,您可以使用 SQL 函数 XMLTable 将员工 XML 元素分解为虚拟表的单个列,如下所示:
SELECT emps.empno,emps.ename, emps.sal FROM
XMLTable(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
return;
$i'
COLUMNS empno NUMBER PATH '/EMPLOYEE/EMPNO',
ename VARCHAR2(30) PATH '/EMPLOYEE/ENAME',
sal NUMBER PATH '/EMPLOYEE/SAL') emps;
该查询将生成以下输出:EMPNO ENAME SAL
----- -------------- ----------
7839 KING 5000
100 King 24000
101 Kochhar 17000
102 De Haan 17000
内容导航
oracle+xquery函数,Oracle XQuery查询、构建和转换XML(2)相关推荐
- oracle xdb xquery,Oracle XQuery查询、构建和转换XML(4)
将动态变量绑定到 XQuery 表达式 另一种可以显著提高 XQuery 表达式执行性能的技术是使用绑定动态变量.使用绑定变量(而不是将变量串联为字符串)可以使 Oracle 重用 SQL 语句,从而 ...
- oracle+xquery函数,Oracle XQuery查询、构建和转换XML
查询 Oracle XML DB 信息库中的 XML 数据 为访问 Oracle XML DB 信息库中存储的 XML 数据,Oracle XQuery 引入了 fn:doc 和 fn:collect ...
- oracle 峰度 函数,Oracle Database 21c 十大新特性一览
摘要:Oracle 考虑到 2020 年我们的客户将面临前所未有的经济和业务中断.我们决定不将 Database 20c Preview 版本升级为 General Availability. 相反, ...
- oracle 四分位函数,Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
Oracle 分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内 ...
- oracle 高效函数,Oracle分组函数之高效的ROLLUP
Oracle/" target=_blank>Oracle分组函数之高效的ROLLUP ㈠ 初始化实验坏境 www.2cto.com [sql] hr@ORCL> create ...
- oracle stdevp函数,ORACLE 系统函数与SQLSERVER系统函数的区别是什么
ORACLE 系统函数与SQLSERVER系统函数的区别是什么 发布时间:2021-03-17 14:40:36 来源:亿速云 阅读:57 作者:Leah 栏目:数据库 这篇文章给大家介绍ORACLE ...
- oracle 数字处理函数,Oracle函数-单行函数-数字、日期、日期处理函数
函数的分类 单行函数:一个input对应一个output,input和output存在一一对应的关系 如lower 组函数:多个input,但是只对应一个output.如 sum() ======== ...
- oracle values函数,Oracle文本函数简介
Oracle文本函数使我们常用的函数,下面就为您介绍几种Oracle文本函数的用法,供您参考学习,希望可以让您对Oracle文本函数有更深的认识. (1)UPPER.LOWER和INITCAP 这三个 ...
- oracle instr函数(oracle 用instr 来代替 like)
oracle instr函数 对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置.例如: SQL> select instr('oracle','or') position ...
最新文章
- find命令删除大量小文件
- 在Service中通过WindowManger添加View的方式来把UI界面显示出来
- excel图片变成代码_三行代码把女朋友照片变成了素描图片!以为我画的!爱我爱的不行...
- 微软Java面试题-按照字母排序
- Flask Web 开发 错误页面自定义
- 别把“运气”当“实力”
- 调用外部程序处理文件_Python使用内置方法、模块调用外部命令
- ngnix 负载均衡原理
- 【图数据库】Neo4j下载、安装、配置、服务注册(国内ftp快速下载)
- 马士兵struts2视频教程第六集
- 判定表与判定树的画法_判定树和判定表
- win11用虚拟机win10安装docker
- 菜肴百度百科html,酸汤鱼
- Latex给表格加脚注
- TscanCode代码扫描工具
- 金华市计算机专业的学校有哪些,金华有哪些技校?
- 笔记本电脑不显示WIFI列表无法连接到网络的解决办法
- 测开系列Selenium Webdriver Python(21)--元素定位2
- 杰理之天线模块【篇】
- 【附源码】Python计算机毕业设计美食推荐系统
热门文章
- Java程序编写 • 【第9章 程序:理解逻辑,日向雏田,日向宁次释放技能;理解逻辑,大蛇丸释放技能(带返回值)】
- spring中的@mapper(componentModel = “spring“)
- 读书笔记《从0到1--开启商业与未来的秘密》
- Ubuntu 18.04.2 安装 x11vnc
- BZOJ4514 [Sdoi2016]数字配对
- 【示波器专题】示波器探头的原理深入——有源探头之单端有源探头
- SQL/Oracle——第六章 PL/SQL函数(作业3)
- 详解python重采样与频率转换之resample()
- [C语言]0、‘0‘、‘\0‘、“0“的区分
- Optional int parameter ‘id‘ is present but cannot be translated into a null