2016-03-19 45 views
2

我试图在插入到ORACLE数据库的表中时验证文档XML。我已经在表中定义了一个XML Schema和一个带有这个模式的XMLTYPE,但是这个数据库允许我插入一个错误的xml。Oracle DB,在插入期间验证xml

我的架构:

BEGIN 
dbms_xmlschema.registerschema(
    schemaurl => 'http://www.testXml.com/schema.xsd', 
    schemadoc => xmltype('<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:complexType name="Name_tp"> 
    <xs:simpleContent> 
    <xs:extension base="xs:string"> 
     <xs:attribute name="Id" type="xs:positiveInteger"/> 
    </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
<xs:complexType name="Category_tp"> 
    <xs:attribute name="NumPrize" type="xs:positiveInteger"/> 
    <xs:attribute name="From" type="xs:integer"/> 
    <xs:attribute name="To" type="xs:positiveInteger"/> 
    <xs:attribute name="Type" type="xs:string"/> 
    <xs:attribute name="Age" type="xs:positiveInteger"/> 
</xs:complexType> 
<xs:complexType name="Match_tp"> 
    <xs:attribute name="typeMatch" type="xs:string"/> 
</xs:complexType> 
<xs:complexType name="GolfCompetition_tp"> 
    <xs:sequence> 
    <xs:element name="Name" type="Name_tp"/> 
    <xs:element name="Date" type="xs:date"/> 
    <xs:element name="Sponsor" type="xs:string"/> 
    <xs:element name="Category" maxOccurs="unbounded" type="Category_tp"/> 
    <xs:element name="Reserved" type="Match_tp" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 
    <xs:element name="GolfCompetition" type="GolfCompetition_tp"/> 
</xs:schema>'), 
local => true, 
gentypes => false, 
gentables => false 
); 
END; 

我的DB模式:

CREATE TYPE t_gara AS OBJECT (
    id INTEGER, 
    informazioni XMLTYPE 
); 

CREATE TABLE gara OF t_gara() XMLType COLUMN informazioni 
XMLSCHEMA "http://www.testXml.com/schema.xsd" 
ELEMENT "GolfCompetition"; 

当我尝试插入该行我没有问题:

INSERT INTO GARA VALUES(1, XMLType('<GolfCompetition> 
<Name Id="324">Coppa del Presidente</Name> 
<Date>2009-12-25</Date> 
<Sponsor>Lavazza S.p.A</Sponsor> 
<Category NumPrize="3" From="0" To="12" Type="First"/> 
<Category NumPrize="3" From="13" To="24" Type="Second"/> 
<Category NumPrize="2" From="25" To="36" Type="Third"/> 
<Category NumPrize="1" Type="Lady"/> 
<Category NumPrize="1" Type="Over" Age="40"/> 
</GolfCompetition>')); 

但这个工程:

INSERT INTO GARA VALUES(2, XMLType('<GolfCompetition> 
<Category NumPrize="3" From="0" To="12" Type="First"/> 
<Category NumPrize="3" From="13" To="24" Type="Second"/> 
<Category NumPrize="2" From="25" To="36" Type="Third"/> 
<Category NumPrize="1" Type="Lady"/> 
<Category NumPrize="1" Type="Over" Age="40"/> 
</GolfCompetition>')); 

我该如何解决?

回答

2

自动模式验证需要以二进制格式存储XML,而不是对象关系。

XML Developer's Guide

For XMLType data that is stored object-relationally, full validation requires building a DOM, which can be costly in terms of memory management. For this reason, Oracle XML DB does not automatically perform full validation when you insert or update data that is stored object-relationally.

重新注册的模式,加入这个参数:

... 
options => dbms_xmlschema.REGISTER_BINARYXML 
... 

创建该表是这样的:

create table gara 
(
    id number, 
    informazioni xmltype 
) xmltype informazioni 
    store as binary xml 
    XMLSCHEMA "http://www.testXml.com/schema.xsd" 
    ELEMENT "GolfCompetition"; 

现在第一次插入会工作但第二次将失败,并出现此错误:

ORA-64464: XML event error 
ORA-19202: Error occurred in XML processing 
LSX-00213: only 0 occurrences of particle "Name", minimum is 1