将数据添加到 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. 首先,在目录 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>
完成!