[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 数 据 库 > Oracle > 正文
 

Oracle XQuery查询、构建和转换XML(2)

来源:Oracle (2006-05-24 13:44:56)

查询 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



(http://www.fanqiang.com)



 
 相关文章
AIX环境oracle用户的.profile文件 2001-08-14 12:00:00
ORACLE8I FOR SUN SOLARIS2.7 安装说明 2001-04-15 20:10:13
Oracle数据库的备份与恢复 2001-04-16 10:26:11
影响ORACLE汉字显示的字符集问题 2001-04-16 10:36:40
如何在你的Linux机器上安装运行Oracle 2001-04-16 10:45:13
Oracle数据库 系统使用经验六则 2001-04-16 10:47:16
ORACLE8的分区管理 2001-04-16 15:46:48
ORACLE用户连接的管理 2001-04-16 15:48:23
如何增加ORACLE连接数 2001-04-16 15:56:11
自动备份Oracle数据库 2001-04-16 15:58:14
ORACLE8.1.7+TOMCAT3.2.1安装手册 2001-04-20 18:14:29
在RedHat 7.0下Oracle 8.1.6 的安装实例 2001-04-21 17:11:55
Oracle8i HowTo 2001-04-21 19:54:43
Oracle 9i 在 Red Hat 7.1 和 7.2 上的安装 2002-03-03 08:00:00
Oracle数据库几种关闭方式 2001-05-13 14:12:25
Oracle数据库几种启动方式 2001-05-23 09:39:17
ORACLE数据库简介 2001-05-14 05:28:00
ORACLE实例的进程结构和内存结构 2001-05-14 08:28:00
oracle Export and Import 简介 2001-05-14 08:28:00
Oracle 8i 新分析工具-LogMiner 2001-05-14 10:00:00
 

★  感谢所有的作者为我们学习技术知识提供了一条捷径  ★
www.fanqiang.com