710 likes | 1.09k Views
Oracle Database 12c 中 Oracle XML DB 简介. Mark D Drake 产品管理经理. 以下内容旨在概述产品的总体发展方向 。 该内容仅供参考,不可纳入任何合同 。 其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据 。 此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定 。. 议题. XML DB 简介 XMLType 和 XQuery 加载 XML XML 生成 XML 和 SQL 集成 XML 存储和索引 XML 模式
E N D
Oracle Database 12c 中 Oracle XML DB 简介 Mark D Drake 产品管理经理
以下内容旨在概述产品的总体发展方向。 该内容仅供参考,不可纳入任何合同。 其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据。 此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定。
议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结
Oracle 的 XML 愿景 • 实现 XML 的单一信息源 • 为管理所有 XML 提供最佳平台 • 灵活地优化处理以数据为中心和以内容为中心的 XML • 实现了 Oracle 对可靠性、安全性、可用性和可伸缩性的承诺 • 推进和实施关键的 XML 标准 • 支持以 SQL 为中心、以 XML 为中心和以文档为中心的开发范例 • 数据库和应用服务器中支持 XML
Oracle 与 XML: 持续创新 XQuery-Update XQuery Full-Text 二进制存储和索引 XQuery 性能 XML 存储和资料库 XML API 1998 2001 2004 2007 2013
议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结
XMLType • 标准数据类型,让数据库可感知 XML • 用于表、列、变量、参数或返回值 • 抽象管理 XML • 加强 XML 内容模型和 XML 高保真 • 实现 XML 模式验证 • 多个持久性和索引选项 • 使用 XQuery 执行查询和更新操作 • 所有应用程序逻辑不受持久性模型的影响
使用 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;
XQuery • 生成、查询和更新 XML 的 W3C 标准 • XML 内容的自然查询语言 • 从 XPath 和 XSLT 发展而来 • 类似于关系世界中的 SQL • 迭代,而不是基于集合 • 基本构造是 FLWOR 子句 • FOR、LET、WHERE、ORDER、RETURN…… • XQuery 操作产生包含零个或更多节点的序列
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
XQuery fn:collection : 使用许多 XML for $doc in fn:collection(“oradb:/OE/PURCHASEORDER”) return $doc • 用于访问文档集合 • 允许 XQuery 在一组 XML 文档上运行 • 集合源包含 • 文件夹内容 • XMLType 表或列 • 圆锥映射模式的关系表 • 协议“oradb:” 导致路径组件应解释为模式、表、列 • 列是可选的
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 子句控制节点顺序
在 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 解释成分号。
使用 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 命令实际执行的操作
数据库原生 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
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 的参考实现
议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结
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 …
BFILE 构造器 create or replace directory XMLDIR as ‘c:\myxmlfiles’; insert into PURCHASEORDER values ( XMLTYPE ( BFILENAME(‘XMLDIR’, ‘SKING-20021009123335560PDT.xml’), NLS_CHARSET_ID(‘AL32UTF8’))); • 目录 XMLDIR 将本地文件系统中的目录引用到数据库服务器 • 必须指定正在加载的文件的字符集编码。
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; }
XML DB 信息库和协议 • 使用 FTP、HTTP 和 WebDAV 将内容直接加载到 Oracle 数据库中的 XMLType 表中
议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结
从关系数据生成 XML • 有了 SQL/XML,可以从关系数据轻松生成 XML • SQL Query 生成的结果集包含一个或多个 XML 文档 • 有了 XQuery,可以从关系表生成基于模板的 XML • fn:collection() 生成关系数据的规范 XML 表示 • 有了 XMLType 视图,可以对关系内容进行持久的以 XML 为中心的访问
使用 SQL/XML 生成 XML • XMLElement() • 生成具有简单或复杂内容的元素 • 简单内容源自标量列或常量 • 复杂内容从 XMLType 列或经由嵌套的 XMLElement 和 XMLAgg() 运算符创建 • XMLAttributes() • 将属性添加到元素 • XMLAgg() • 将通常来自嵌套子查询的集合转换成包含片段的 XMLType • 类似于 SQL 聚合运算符
例如: 使用 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
议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结
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”子句提供
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”子句提供
XMLTable(): XML 的关系视图 • “COLUMNS”子句扩展XMLTable,允许创建 XML 内容的线性关系视图 • 支持对 XML 内容进行 SQL 操作 • 视图允许识别非XML 的工具访问 XML 内容 • 使用链式XMLTable操作管理的集合层级 • 将传递到链的元素作为XMLType片段重复
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’;
XQuery-Update 支持 对 XML 内容进行兼容标准的更新 • http://www.w3.org/TR/xquery-update-10/ • 以声明方式修改和转换 XML 内容 • 替换、删除、插入、重命名 • 数据库支持复制/修改 XQuery-Update 表单 • 可能时,将操作重写到部分更新 • 从 11.2.0.3.0 版本开始支持
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 提供新值
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 子句的目标节点 • 在返回子句中指定修改
XQuery-Update 使用 • 更新 Oracle 数据库中存储的 XML • XML 数据屏蔽 • 创建使用 XQuery-Update 的 XMLType 视图来删除或屏蔽内容 • 在较早的数据库版本中,使用 Oracle 特定运算符支持更新 xml • UpdateXML()、DeleteXML()、insertChildXML() 等 • 该运算符将在下一版 Oracle 数据库中弃用
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 开始提供
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() 配合使用来执行基于全文的片段提取 • 支持文档、片段、元素和属性级别运算 • 文档和片段级运算以所有后代节点为目标
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]
XQuery-FullText 索引 • 基于现有 Oracle Text(上下文)技术 • 经过验证的全文搜索功能 • 可识别各种命名空间
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 操作
XQuery-Full Text 说明 • XQuery-FullText 包含 contains() 和 ora:contains() 运算符 • 避免在 XML 内容上使用 SQL contains 运算符 • ora:contains 运算符在下一版数据库中弃用,转为使用 XQuery-FullText
其他 SQL/XML 运算符 • XMLCast() • 与 XMLQuery() 运算符配合使用 • 将 XML 标量转换成 SQL 标量 • XMLTransfom() • 基于 XSL 的转换 • XMLNamespaces() • 命名空间管理 • SchemaValidate() • XMLType 方法用于针对 XML 模式验证文档
议题 • XML DB 简介 • XMLType 和 XQuery • 加载 XML • XML 生成 • XML 和 SQL 集成 • XML 存储和索引 • XML 模式 • XML DB 信息库 • 数据库原生 Web 服务 • 总结
二进制持久性 SQL> create table PURCHASEORDER of XMLTYPE 2> XMLTYPE store as SECUREFILE BINARY XML; • 在磁盘上存储解析后的 XML 表示 • 减少了存储需求 • 标记令牌化,内容以原生表示存储 • 针对流、索引和片段提取进行了优化。 • 磁盘、内存和服务器与客户端上使用的单一表示 • 提取 XML 后,无解析/序列化开销 • 部分更新 • 无模式和 XML 模式感知版本
Oracle 二进制 XML Web缓存 数据库 客户端 应用服务器 二进制 XML 二进制 XML 二进制 XML XQuery、Java、‘C’ SQL、PL/SQL XQuery XQuery、JAVA、‘C’
客户端编码 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
客户端编码 • 允许将 XML 的解析和编码开销从数据库移到客户端 • 总体网络流量减少 • 数据库 CPU 使用减少 • 客户端 CPU 使用增加(没有免费的午餐) • 从一个连接插入多个类似文档时最为有效 • 从 InputStream 构造 XMLType 时最为有效。 • 从 XMLDocument 构造 XMLType 时,不建议使用
客户端编码: 发送到服务器的字节 • 发送到服务器的字节减少 50% • 完美的莎士比亚作品 • 36 个文件、9,067,913 字节 • 高内容标记比
客户端编码: 发送到服务器的字节 • 从服务器读取 2 倍字节数 • 客户端需要标记表来进行 XML 编码 • 低于 .001% 的内容
客户端编码: CPU 使用 • DB CPU 减少 85% • 客户端 CPU 增长 8 倍 • 所用时间减少 5% • 可伸缩性显著提高