2016-03-19 20 views
2

ドキュメントXMLをORACLEデータベースの表に挿入する際に、XMLを検証しようとしています。私はテーブル内にこのスキーマを持つXMLスキーマとXMLTYPEを定義しましたが、dbは間違った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"; 

第1のインサートの意志をこのエラーで2番目のエラーは失敗します。

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