2

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

私のデータベーススキーマ:

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>'));

どうすれば解決できますか?

4

1 に答える 1

2

自動スキーマ検証では、XML をオブジェクト リレーショナル形式ではなく、バイナリ形式で格納する必要があります。

XML 開発者ガイドから:

オブジェクト・リレーショナルに格納された XMLType データの場合、完全な検証にはDOMの構築が必要ですが、これはメモリー管理の点でコストがかかる可能性があります。このため、オブジェクト・リレーショナルに格納されたデータを挿入または更新する場合、Oracle XML DBは完全な検証を自動的に実行しません。

次のパラメーターを追加して、スキーマを再登録します。

...
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";

最初の挿入は機能しますが、2 番目の挿入は次のエラーで失敗します。

ORA-64464: XML event error
ORA-19202: Error occurred in XML processing
LSX-00213: only 0 occurrences of particle "Name", minimum is 1
于 2016-03-20T03:53:27.680 に答える