oracle+xquery函数,Oracle XQuery查询、构建和转换XML
查询 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相关推荐
- oracle xdb xquery,Oracle XQuery查询、构建和转换XML(4)
将动态变量绑定到 XQuery 表达式 另一种可以显著提高 XQuery 表达式执行性能的技术是使用绑定动态变量.使用绑定变量(而不是将变量串联为字符串)可以使 Oracle 重用 SQL 语句,从而 ...
- oracle+xquery函数,Oracle XQuery查询、构建和转换XML(2)
查询 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 ...
最新文章
- Netty序章之BIO NIO AIO演变
- IOS开发错误library not found for -lXXX
- 袁新生《LINGO和Excel在数学建模中的应用》
- Hashtable排序
- jdbctemplate mysql 分页查询 返回list对象_spring jdbctemplate调用存储过程,返回list对象...
- 如何全面的把握一个系统的异常处理
- linux中的mysql启动失败(一直连续出现点点的状态)
- mysql 二元分词_MySQL 中文分词原理
- 初探C语言指针之何为指针变量
- 【物理应用】基于matlab GUI工程供配电系统【含Matlab源码 1051期】
- 基于51单片机的蓝牙循迹小车
- Win7如何解决精简版的迅雷7无法运行
- 键盘测试软件能自动,键盘测试软件哪个好用?2020键盘测试软件推荐
- 洛谷P2141 珠心算测验
- ヴィアッカ / 风锤
- 基于RSA+AES 软件授权License
- 课时31 永久储存:腌制一缸美味的泡菜
- Windows 系统无法启动(错误代码:0xc000000e)的修复
- 从一千万条短信中找出重复次数最多的前10条
- 计算机夏令营英语自我介绍,夏令营英文自我介绍范文5篇
热门文章
- MySQL Dll语句
- 美国虚拟主机安全吗?
- nested exception is java.lang.IncompatibleClassChangeError: Implementing class(已解决)
- System.ComponentModel.Win32Exception (0x80004005): 无效的窗口句柄。
- System.ComponentModel.Component入门
- 【Java深入】深拷贝与浅拷贝详解
- 当幸福来敲门(转载)
- C/C++文件输入输出操作——FILE*、fstream、windowsAPI(转载)
- oracle c op,ORACLE中内部函数SYS_OP_C2C和隐式类型转换
- android 5.1.1 root,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)