时间: 2021-07-31 作者:daque
查问 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 消息库
declarexmldoc xmltype;beginselect xmlquery('for $j in ora:view("scott", "dept")/rowwhere $j/deptno = 10return ({$j/deptno,$j/dname} {for $i in ora:view("scott", "emp")/rowwhere $i/deptno = $j/deptnoreturn ({$i/empno,$i/ename,$i/sal})} )'returning content) into xmldoc from dual;if(dbms_xdb.createresource('/public/employees/acc_dept.xml', xmldoc)) thendbms_output.put_line('resource is created');elsedbms_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")//employeewhere $i/sal >= 5000order by $i/enamereturn;$i'returning content) from dual;
该结构应天生以次输入:
102de haan170007839king5000100king24000101kochhar17000
您不妨看到,之上输入包括从 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")//employeewhere $i/sal >= 5000return;$i'columns empno number path '/employee/empno',ename varchar2(30) path '/employee/ename',sal number path '/employee/sal') emps;
该查问将天生以次输入:
empno ename sal----- -------------- ----------7839 king 5000100 king 24000101 kochhar 17000102 de haan 17000