oracle操作xml笔记二

使用 XML

将数据添加到 XMLType 表和列中。 正如您可能预期到的,有很多选项可供我们将 XML 数据添加到数据库中。可以使用 SQL、PL/SQL、Java 和 C 程序插入数据。也可以使用 XMLType 表的 SQL*Loader 和 Import/Export 函数将数据加载到数据库中。可以使用 Oracle Streams 来移动 XML 数据,还可以使用 DBMS_XDB 函数。现在,就让我们来探究一个简单易用的方式来加载 XML 数据。

在本例中,我们将使用 SQL 插入将一个 XML 文档从文件加载到表中,以便从 bfile 加载该 XML 文档。该文件需要通过一个数据库目录访问。为此,我们将创建一个目录以指向存储该 XML 文档文件的文件。请注意,要执行本文中的示例,您必须确保所用用户具有 xdbadmin 角色。

create or replace directory xmldir as '/u01/app/oracle/admin/db01/sql';

现在我们可以用两种方式创建包含 XMLType 数据的表。第一个将是具有 XMLType 列的表。第二个将是定义为类型 XMLType 的表。

1. 创建一个包含 XML 列的表。

create table invoiceXML_col (
inv_id number primary key,
inv_doc XMLType); 

2. 创建一个 XML 表。

create table invoiceXML_tbl of XMLtype; 

以上每一个语句都在每个表中隐式创建两个索引 — 一个用于主键,另一个用于 LOB。

现在我们要将一个发票文档插入到这两个表中。请注意,我们要使用字符集 AL32UTF8,并指定它传送字符集编码来供要读取的文件使用。数据将插入这两个表以显示这两个 SQL 语句间的相似性。

Insert into invoicexml_col values (1, 
XMLType(bfilename('XMLDIR', 'invoicexml.txt'), 
nls_charset_id('AL32UTF8') )); 

Insert into invoicexml_tbl values 
(XMLType(bfilename('XMLDIR', 'invoicexml.txt'),
 nls_charset_id('AL32UTF8')));

我们现在已经使用 XMLType 表和列将两个 XML 文档加载到了数据库中。就是这么简单。

注册和实现模式类型化数据

如果处理命名空间和存储技术不足,XMLType 数据也可以实现为模式类型化或非类型化数据。XMLSchema 可将文档与提供文档结构和内容信息的 XMLSchema 相关联。这为文档提供了更好的记录、验证和控制。该模式中的信息可用于提交更有效的查询和更新处理。XMLSchema 也允许将 XML 文档存储为结构化存储数据,因为该文档可以通过 XMLSchema 分解为一组对象。用于存储该文档的对象模型由模式定义确定。XMLType 方法 schemaValidate() 和 isSchemaValid() 允许使用模式定义编辑 XMLType 文档。

我们如何创建模式并在 XML 文档中使用它?为此,我们需要创建一个 XMLSchema 定义

  1. 注册该模式
  2. 创建一个基于 XMLSchema 的表
  3. 将数据插入其中

下面的示例分四步进行了说明。

1. 首先,在目录 XML_DIR 下的文件 invoiceformtest.xsd 中创建一个模式定义。该清单如下所示:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:xdb=http://xmlns.oracle.com/xdb version="1.0">
<xs:element name="INVOICEFORMTEST" xdb:defaultTable="INVOICEFORMTEST">
   <xs:complexType>
      <xs:sequence>
         <xs:element name="MailAddressTo">
            <xs:complexType>
               <xs:sequence> 
                  <xs:element name="Person" type="xs:string"/>
                  <xs:element name="Street" type="xs:string"/>
                  <xs:element name="City" type="xs:string"/>
                  <xs:element name="State" type="xs:string"/>
                  <xs:element name="Zipcode" type="xs:string"/>
               </xs:sequence>    
               <xs:attribute name="id" type="xs:string" use="required"/>  
         </xs:element>
      </xs:sequence>
   </xs:complexType>
</xs:element>
</xs:schema>

2. 使用过程 DBMS_XMLSCHEMA.registerSchema 在数据库中注册上面的模式。您用来连接到数据库的用户名需要修改会话权限,以便该模式可以成功注册。

BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://xmlns.oracle.com/xdb/invoiceformtest.xsd',
    SCHEMADOC => bfilename('XMLDIR','invoiceformtest.xsd'),
    CSID => nls_charset_id('AL32UTF8'));
END;
/

要删除该模式,只需运行 DBMS_XMLSCHEMA.deleteSchema 语句,如下所示:

BEGIN
  DBMS_XMLSCHEMA.deleteSchema(
  SCHEMAURL => 'http://xmlns.oracle.com/xdb/invoiceformtest.xsd',
  DELETE_OPTION => dbms_xmlschema.DELETE_CASCADE_FORCE);
END;
/

3. 由于上面模式定义中的 xdb:defaultTable="INVOICEFORMTEST" 语句,以上语句还创建了表 invoiceformtest。没有它,将创建一个生成的名称(您不想使用该名称)。

4. 现在,我们准备将文档输入到 XML 文档内基于 XMLSchema 的表中,该文档存储在 XML_DIR 中并使用实现的模式指定的格式。

Insert into invoiceformtest values 
(XMLType(bfilename('XMLDIR', 'invoiceformtest.txt'),
 nls_charset_id(' AL32UTF8')));

来看一下我们刚刚使用 XML 文档上的 object_value pseudocolumn 创建的内容。

SQL> select object_value from invoiceformtest;

OBJECT_VALUE

<INVOICEFORMTEST>
     <MailAddressTo id="1">
            <Person>Joe Smith</Person>
            <Street>10 Apple Tree Lane</Street>
            <City>New York</City>
            <State>NY</State>
            <Zipcode>12345</Zipcode>
     </MailAddressTo>
</INVOICEFORMTEST>

完成!

你可能感兴趣的:(数据结构,oracle,sql,apple,xml)