1 / 71

Oracle Database 12c 中 Oracle XML DB 简介

Oracle Database 12c 中 Oracle XML DB 简介. Mark D Drake 产品管理经理. 以下内容旨在概述产品的总体发展方向 。 该内容仅供参考,不可纳入任何合同 。 其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据 。 此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定 。. 议题. XML DB 简介 XMLType 和 XQuery 加载 XML XML 生成 XML 和 SQL 集成 XML 存储和索引 XML 模式

zack
Download Presentation

Oracle Database 12c 中 Oracle XML DB 简介

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Oracle Database 12c 中 Oracle XML DB 简介 Mark D Drake 产品管理经理

  2. 以下内容旨在概述产品的总体发展方向。 该内容仅供参考,不可纳入任何合同。 其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据。 此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定。

  3. 议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结

  4. Oracle 的 XML 愿景 • 实现 XML 的单一信息源 • 为管理所有 XML 提供最佳平台 • 灵活地优化处理以数据为中心和以内容为中心的 XML • 实现了 Oracle 对可靠性、安全性、可用性和可伸缩性的承诺 • 推进和实施关键的 XML 标准 • 支持以 SQL 为中心、以 XML 为中心和以文档为中心的开发范例 • 数据库和应用服务器中支持 XML

  5. Oracle 与 XML: 持续创新 XQuery-Update XQuery Full-Text 二进制存储和索引 XQuery 性能 XML 存储和资料库 XML API 1998 2001 2004 2007 2013

  6. 议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结

  7. XMLType • 标准数据类型,让数据库可感知 XML • 用于表、列、变量、参数或返回值 • 抽象管理 XML • 加强 XML 内容模型和 XML 高保真 • 实现 XML 模式验证 • 多个持久性和索引选项 • 使用 XQuery 执行查询和更新操作 • 所有应用程序逻辑不受持久性模型的影响

  8. 使用 XMLType create table INVOICES of XMLTYPE; create table PURCHCASEORDERS ( PO_NUMBER NUMBER(4), PO_DETAILS XMLTYPE ) XMLTYPE column PO_DETAILS XMLSCHEMA "http://schemas.example.com/PurchaseOrder.xsd" ELEMENT “PurchaseOrder“ STORE AS OBJECT RELATIONAL;

  9. XQuery • 生成、查询和更新 XML 的 W3C 标准 • XML 内容的自然查询语言 • 从 XPath 和 XSLT 发展而来 • 类似于关系世界中的 SQL • 迭代,而不是基于集合 • 基本构造是 FLWOR 子句 • FOR、LET、WHERE、ORDER、RETURN…… • XQuery 操作产生包含零个或更多节点的序列

  10. XQuery FLWOR 示例 for $l in $PO/PurchaseOrder/LineItems/LineItem return $l/Part/@Description <PurchaseOrder DateCreated=“2011-01-31”> … <LineItems> <LineItem ItemNumber="1"> <Part Description="Octopus“>31398750123</Part> <Quantity>3.0</Quantity> </LineItem> ….. <LineItem ItemNumber="5"> <Part Description="King Ralph">18713810168</Part> <Quantity>7.0</Quantity> </LineItem> </LineItems> </PurchaseOrder > Octopus …. King Ralph

  11. XQuery fn:collection : 使用许多 XML for $doc in fn:collection(“oradb:/OE/PURCHASEORDER”) return $doc • 用于访问文档集合 • 允许 XQuery 在一组 XML 文档上运行 • 集合源包含 • 文件夹内容 • XMLType 表或列 • 圆锥映射模式的关系表 • 协议“oradb:” 导致路径组件应解释为模式、表、列 • 列是可选的

  12. XQuery: Where 和 Order by 子句 let $USER := “SKING” for $doc in fn:collection(“oradb:/OE/PURCHASEORDER”) where $doc/PurchaseOrder[User = $USER] order by $doc/PurchaseOrder/Reference return $doc/PurchaseOrder/Reference • Where 子句控制对哪些文档或节点进行处理 • 启用谓词 • Order by 子句控制节点顺序

  13. 在 SQL*Plus 中执行 XQuery SQL> XQUERY 2 let $USER := "SKING" 3for $doc in fn:collection("oradb:/OE/PURCHASEORDER") 4 where $doc/PurchaseOrder[User = $USER] 5 order by $doc/PurchaseOrder/Reference 6 return $doc/PurchaseOrder/Reference 7 / • 如果 XQuery 语句以 ‘;’ 结尾,则使用空注释 (: :) 防止被 SQL 解释成分号。

  14. 使用 XMLTable 执行 XQuery select * from XMLTABLE ( 'for $doc in fn:collection("oradb:/OE/PURCHASEORDER") return $doc/PurchaseOrder/Reference' ) • 将 XQuery 返回的序列转换成关系结果集 • JDBC/OCI 程序 • 尚未提供原生 XQuery 支持的工具 • SQL*Developer、APEX SQL Workbench • 这是 SQL*PLUS XQUERY 命令实际执行的操作

  15. 数据库原生 Web 服务中的 XQuery <ENV:Envelope xmlns:ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ENV:Body> <m:query xmlns:m="http://xmlns.oracle.com/orawsv"> <m:query_text type="XQUERY“> for $doc in fn:collection("oradb:/OE/PURCHASEORDER") return $doc/PurchaseOrder/Reference </m:query_text> <m:pretty_print>true</m:pretty_print> </m:query> </ENV:Body> </ENV:Envelope> • WSDL 位置: http://dbserver:port/orawsv?wsdl

  16. JCR-225 或 XQJ import javax.xml.xquery.* XQDataSource dataSource = new oracle.xml.xquery.OXQDataSource(); XQConnection connection = dataSource.getConnection(); XQExpression expression = connection.createExpression(); XQResultSequence result = expression.executeQuery ("for $doc in fn:collection(\"oradb:/OE/PURCHASEORDER\") return $doc/PurchaseOrder/Reference"); result.writeSequence(System.out, null); result.close(); • Java 的原生 XQuery API • XQJ 对 XQuery 相当于 JDBC 对 SQL • Oracle XMLDB 的参考实现

  17. 议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结

  18. SQL 加载器 load data infile 'filelist.dat' append into table PURCHASEORDER xmltype(XMLDATA) ( filename filler char(120), XMLDATA lobfile(filename) terminated by eof ) • 从本地文件系统加载文件集 • Filelist.dat 包含要加载的文件列表 C:\purchaseOrders\ABANDA-20020405224101614PST.xml C:\purchaseOrders\ABANDA-20020406224701221PDT.xml …

  19. BFILE 构造器 create or replace directory XMLDIR as ‘c:\myxmlfiles’; insert into PURCHASEORDER values ( XMLTYPE ( BFILENAME(‘XMLDIR’, ‘SKING-20021009123335560PDT.xml’), NLS_CHARSET_ID(‘AL32UTF8’))); • 目录 XMLDIR 将本地文件系统中的目录引用到数据库服务器 • 必须指定正在加载的文件的字符集编码。

  20. JDBC、OCI、PL/SQL public boolean doInsert(String filename) throws SQLException, FileNotFoundException { String statementText = "insert into PURCHASEORDER values (:1)“; Connection conn = getConnection(); OracleCallableStatement statement = (OracleCallableStatement) conn.prepareStatement(statementText); FileInputStream is = new FileInputStream(filename); XMLType xml = XMLType.createXML(this.getConnection(),is); statement.setObject(1,xml); boolean result = statement.execute(); statement.close(); conn.commit(); return result; }

  21. XML DB 信息库和协议 • 使用 FTP、HTTP 和 WebDAV 将内容直接加载到 Oracle 数据库中的 XMLType 表中

  22. 议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结

  23. 从关系数据生成 XML • 有了 SQL/XML,可以从关系数据轻松生成 XML • SQL Query 生成的结果集包含一个或多个 XML 文档 • 有了 XQuery,可以从关系表生成基于模板的 XML • fn:collection() 生成关系数据的规范 XML 表示 • 有了 XMLType 视图,可以对关系内容进行持久的以 XML 为中心的访问

  24. 使用 SQL/XML 生成 XML • XMLElement() • 生成具有简单或复杂内容的元素 • 简单内容源自标量列或常量 • 复杂内容从 XMLType 列或经由嵌套的 XMLElement 和 XMLAgg() 运算符创建 • XMLAttributes() • 将属性添加到元素 • XMLAgg() • 将通常来自嵌套子查询的集合转换成包含片段的 XMLType • 类似于 SQL 聚合运算符

  25. 例如: 使用 SQL/XML select xmlElement ( "Department",     xmlAttributes( d.DEPTNO as “Id"),      xmlElement("Name", d.DNAME),     xmlElement("Employees”,            ( select xmlAgg(                       xmlElement("Employee",                         xmlForest( e.ENAME as "Name", e.HIREDATE s"StartDate”) ) )  from EMP e where e.DEPTNO = d.DEPTNO ) ) ) as XML  from DEPT d

  26. 议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结

  27. XMLExists() XQuery 谓词 SQL> select OBJECT_VALUE “XML” 2 from PURCHASEORDER 3 where XMLEXISTS ( 4 '$PO/PurchaseOrder[Reference=$REF]’ 5 passing OBJECT_VALUE as "PO", 6 'SKING-20021009123336131PDT' as "REF“ 7 ); • 在 SQL where 子句中使用,根据 XQuery 表达式筛选行 • 绑定变量通过“Passing”子句提供

  28. XMLQuery() 片段访问 SQL> select XMLQUERY( 2 '$PO/PurchaseOrder/ShippingInstructions’ 3 passing OBJECT_VALUE as "PO“ 4 returning content) XML 5 from PURCHASEORDER 6 where XMLEXISTS( 7 '$PO/PurchaseOrder[Reference=$REF]‘ 8 passing OBJECT_VALUE as "PO", 'SKING-20021009123336131PDT' as "REF"); • 在 SQL where 子句中使用,从结果集的每个文档中提取片段。 • 绑定变量通过“Passing”子句提供

  29. XMLTable(): XML 的关系视图 • “COLUMNS”子句扩展XMLTable,允许创建 XML 内容的线性关系视图 • 支持对 XML 内容进行 SQL 操作 • 视图允许识别非XML 的工具访问 XML 内容 • 使用链式XMLTable操作管理的集合层级 • 将传递到链的元素作为XMLType片段重复

  30. XMLTable 列子句 SQL> select m.REFERENCE, l.LINENO, l.QUANTITY 2 from PURCHASEORDER, 3 XMLTable( 4 '$PO/PurchaseOrder' passing OBJECT_VALUE as "PO” 5 COLUMNS 6 REFERENCE VARCHAR2(32) PATH 'Reference',‘, 7 LINEITEM_FRAGMENT XMLTYPE PATH 'LineItems/LineItem’ 8 ) m, 9 XMLTable( 10 '$LI/LineItem' passing m.LINEITEM_FRAGMENT as "LI” 11 COLUMNS 12 LINENO NUMBER(4) PATH '@ItemNumber‘, 13 UPC NUMBER(14) PATH 'Part/text()‘, 14 QUANTITY NUMBER(5) PATH 'Quantity‘ 15 ) l|16 where l.UPC = '24543000457’;

  31. XQuery-Update 支持 对 XML 内容进行兼容标准的更新 • http://www.w3.org/TR/xquery-update-10/ • 以声明方式修改和转换 XML 内容 • 替换、删除、插入、重命名 • 数据库支持复制/修改 XQuery-Update 表单 • 可能时,将操作重写到部分更新 • 从 11.2.0.3.0 版本开始支持

  32. XQuery-Update 支持 update TABLE set XML_COLUMN = xmlQUERY( 'copy $NEWXML := $XML modify ( let $TARGET := $NEWXML/rootElement/targetElement return replace node $TARGET with $NEWCONTENT ) return $NEWXML’ passing XML_COLUMN as "XML“, V_NEW_CONTENT as " NEWCONTENT “ returning content ) where … • 将包含 XQuery-Update 表达式的 XMLQuery 运算符与 SQL Update 语句合并 • XQuery-Update 为 XMLType 提供新值

  33. XQuery-Update 支持 copy $NEWPO := $PO modify ( let $ROOT := $NEWPO/PurchaseOrder let $SHIPINST := $ROOT/ShippingInstructions return ( replace value of node $ROOT/User with $NEWUSER, replace node $ROOT/Requestor with element Requestor {$NEWNAME}, delete node $SHIPINST/address, insert node element street {$STREET} as last into $SHIPINST, insert node element city {$CITY} as last into $SHIPINST, insert node element zipcode {$ZIPCODE} as last into $SHIPINST ) ) return $NEWPO • 选择用于For 或 Let 子句的目标节点 • 在返回子句中指定修改

  34. XQuery-Update 使用 • 更新 Oracle 数据库中存储的 XML • XML 数据屏蔽 • 创建使用 XQuery-Update 的 XMLType 视图来删除或屏蔽内容 • 在较早的数据库版本中,使用 Oracle 特定运算符支持更新 xml • UpdateXML()、DeleteXML()、insertChildXML() 等 • 该运算符将在下一版 Oracle 数据库中弃用

  35. XQuery-FullText 支持 与标准兼容的 XML 内容全文搜索 • XQFT http://www.w3.org/TR/xpath-full-text-10/ • 在 XML 内容中进行声明式全文搜索 • 包含文本、词干、窗口 • 逻辑全文运算符: ftor, ftand, ftMildNot • XQuery contains() 运算符限于“string within string”搜索 • XQuery-FullText 运算通过 XML 感知全文(上下文)索引获得了优化 • 从 Oracle Database 12.1.0.1.0 开始提供

  36. XQuery-FullText 支持 select PURCHASEORDER_XML from PURCHASEORDERSwhere XMLExists( '$P/PurchaseOrder/ShippingInstructions/Address/street[. contains text {$PHRASE}]‘ passing PURCHASEORDER_XML as "P“, 'sport' as "PHRASE“ ); • 与 XMLExists() 运算符配合使用执行全文筛选 • 与 XMLQuery() 和 XMLTable() 配合使用来执行基于全文的片段提取 • 支持文档、片段、元素和属性级别运算 • 文档和片段级运算以所有后代节点为目标

  37. XQuery-FullText 支持 通用运算 $PO/PurchaseOrder/ShippingInstructions/Address/street[. contains text {$WORD} using stemming] • 使用词干搜索词汇的不同形式 • 使用 FT 逻辑运算符搜索多个词汇 • 使用窗口指定词与词之间的距离 '$PO/PurchaseOrder/ShippingInstructions/Address[. contains text {$WORD1} ftand {$WORD2} $P/PurchaseOrder/ShippingInstructions/Address[. contains text {$WORD1} ftand {$WORD2} window 6 words]

  38. XQuery-FullText 索引 • 基于现有 Oracle Text(上下文)技术 • 经过验证的全文搜索功能 • 可识别各种命名空间

  39. XQuery-FullText 索引创建 BEGIN CTX_DDL.CREATE_SECTION_GROUP('XQFT','PATH_SECTION_GROUP'); CTX_DDL.SET_SEC_GRP_ATTR('XQFT','XML_ENABLE','T'); CTX_DDL.create_preference('STORAGE_PREFS', 'BASIC_STORAGE'); CTX_DDL.set_attribute( 'STORAGE_PREFS', 'D_TABLE_CLAUSE', 'LOB(DOC) STORE AS SECUREFILE (COMPRESS MEDIUM CACHE)‘ ); CTX_DDL.set_attribute( 'STORAGE_PREFS', 'I_TABLE_CLAUSE', 'LOB(TOKEN_INFO) STORE AS SECUREFILE (NOCOMPRESS CACHE)');END;/ CREATE INDEX PURCHASEORDER_XQFT_IDX ON PURCHASEORDER(OBJECT_VALUE) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS( 'storage STORAGE_PREFS| section group XQFT’ )/ • 使用 XMLExists() 执行 XQuery-FullText 操作

  40. XQuery-Full Text 说明 • XQuery-FullText 包含 contains() 和 ora:contains() 运算符 • 避免在 XML 内容上使用 SQL contains 运算符 • ora:contains 运算符在下一版数据库中弃用,转为使用 XQuery-FullText

  41. 其他 SQL/XML 运算符 • XMLCast() • 与 XMLQuery() 运算符配合使用 • 将 XML 标量转换成 SQL 标量 • XMLTransfom() • 基于 XSL 的转换 • XMLNamespaces() • 命名空间管理 • SchemaValidate() • XMLType 方法用于针对 XML 模式验证文档

  42. 议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结

  43. 二进制持久性 SQL> create table PURCHASEORDER of XMLTYPE 2> XMLTYPE store as SECUREFILE BINARY XML; • 在磁盘上存储解析后的 XML 表示 • 减少了存储需求 • 标记令牌化,内容以原生表示存储 • 针对流、索引和片段提取进行了优化。 • 磁盘、内存和服务器与客户端上使用的单一表示 • 提取 XML 后,无解析/序列化开销 • 部分更新 • 无模式和 XML 模式感知版本

  44. Oracle 二进制 XML Web缓存 数据库 客户端 应用服务器 二进制 XML 二进制 XML 二进制 XML XQuery、Java、‘C’ SQL、PL/SQL XQuery XQuery、JAVA、‘C’

  45. 客户端编码 XMLType xml = new XMLType(connection,is); xml.setBinaryXML(); xml.setMetadataConn(connection); statement.setObject(1,xml); boolean result = statement.execute(); • 在执行之前,插入语句调用 XMLType 对象上的 setBinaryXML() 和 setMetadataConn() 方法,以启用客户端编码 • 当前尚不支持 JDBC 4.0 XMLType 对象 • 使用 xdb.jar,而非 xdb6.jar

  46. 客户端编码 • 允许将 XML 的解析和编码开销从数据库移到客户端 • 总体网络流量减少 • 数据库 CPU 使用减少 • 客户端 CPU 使用增加(没有免费的午餐) • 从一个连接插入多个类似文档时最为有效 • 从 InputStream 构造 XMLType 时最为有效。 • 从 XMLDocument 构造 XMLType 时,不建议使用

  47. 客户端编码: 发送到服务器的字节 • 发送到服务器的字节减少 50% • 完美的莎士比亚作品 • 36 个文件、9,067,913 字节 • 高内容标记比

  48. 客户端编码: 发送到服务器的字节 • 从服务器读取 2 倍字节数 • 客户端需要标记表来进行 XML 编码 • 低于 .001% 的内容

  49. 客户端编码: CPU 使用 • DB CPU 减少 85% • 客户端 CPU 增长 8 倍 • 所用时间减少 5% • 可伸缩性显著提高

More Related