2016-03-19 46 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