查询 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相关推荐

  1. oracle xdb xquery,Oracle XQuery查询、构建和转换XML(4)

    将动态变量绑定到 XQuery 表达式 另一种可以显著提高 XQuery 表达式执行性能的技术是使用绑定动态变量.使用绑定变量(而不是将变量串联为字符串)可以使 Oracle 重用 SQL 语句,从而 ...

  2. oracle+xquery函数,Oracle XQuery查询、构建和转换XML(2)

    查询 Oracle XML DB 信息库中的 XML 数据 为访问 Oracle XML DB 信息库中存储的 XML 数据,Oracle XQuery 引入了 fn:doc 和 fn:collect ...

  3. oracle 峰度 函数,Oracle Database 21c 十大新特性一览

    摘要:Oracle 考虑到 2020 年我们的客户将面临前所未有的经济和业务中断.我们决定不将 Database 20c Preview 版本升级为 General Availability. 相反, ...

  4. oracle 四分位函数,Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…

    Oracle 分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内 ...

  5. oracle 高效函数,Oracle分组函数之高效的ROLLUP

    Oracle/" target=_blank>Oracle分组函数之高效的ROLLUP ㈠ 初始化实验坏境 www.2cto.com [sql] hr@ORCL> create ...

  6. oracle stdevp函数,ORACLE 系统函数与SQLSERVER系统函数的区别是什么

    ORACLE 系统函数与SQLSERVER系统函数的区别是什么 发布时间:2021-03-17 14:40:36 来源:亿速云 阅读:57 作者:Leah 栏目:数据库 这篇文章给大家介绍ORACLE ...

  7. oracle 数字处理函数,Oracle函数-单行函数-数字、日期、日期处理函数

    函数的分类 单行函数:一个input对应一个output,input和output存在一一对应的关系 如lower 组函数:多个input,但是只对应一个output.如 sum() ======== ...

  8. oracle values函数,Oracle文本函数简介

    Oracle文本函数使我们常用的函数,下面就为您介绍几种Oracle文本函数的用法,供您参考学习,希望可以让您对Oracle文本函数有更深的认识. (1)UPPER.LOWER和INITCAP 这三个 ...

  9. oracle instr函数(oracle 用instr 来代替 like)

    oracle instr函数 对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置.例如: SQL> select instr('oracle','or') position ...

最新文章

  1. Netty序章之BIO NIO AIO演变
  2. IOS开发错误library not found for -lXXX
  3. 袁新生《LINGO和Excel在数学建模中的应用》
  4. Hashtable排序
  5. jdbctemplate mysql 分页查询 返回list对象_spring jdbctemplate调用存储过程,返回list对象...
  6. 如何全面的把握一个系统的异常处理
  7. linux中的mysql启动失败(一直连续出现点点的状态)
  8. mysql 二元分词_MySQL 中文分词原理
  9. 初探C语言指针之何为指针变量
  10. 【物理应用】基于matlab GUI工程供配电系统【含Matlab源码 1051期】
  11. 基于51单片机的蓝牙循迹小车
  12. Win7如何解决精简版的迅雷7无法运行
  13. 键盘测试软件能自动,键盘测试软件哪个好用?2020键盘测试软件推荐
  14. 洛谷P2141 珠心算测验
  15. ヴィアッカ / 风锤
  16. 基于RSA+AES 软件授权License
  17. 课时31 永久储存:腌制一缸美味的泡菜
  18. Windows 系统无法启动(错误代码:0xc000000e)的修复
  19. 从一千万条短信中找出重复次数最多的前10条
  20. 计算机夏令营英语自我介绍,夏令营英文自我介绍范文5篇

热门文章

  1. MySQL Dll语句
  2. 美国虚拟主机安全吗?
  3. nested exception is java.lang.IncompatibleClassChangeError: Implementing class(已解决)
  4. System.ComponentModel.Win32Exception (0x80004005): 无效的窗口句柄。
  5. System.ComponentModel.Component入门
  6. 【Java深入】深拷贝与浅拷贝详解
  7. 当幸福来敲门(转载)
  8. C/C++文件输入输出操作——FILE*、fstream、windowsAPI(转载)
  9. oracle c op,ORACLE中内部函数SYS_OP_C2C和隐式类型转换
  10. android 5.1.1 root,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)