针对XSD的Oracle XML验证具有意外结果

时间:2015-12-03 14:38:15

标签: sql xml oracle plsql xsd

我正在生成一个必须符合标准XSD的XML。

到目前为止,我注册了XSD,我创建了一个带有XMLType列的表,与xsd定义绑定如下:

CREATE TABLE DEVEL.SEPE_E8_XMLDOCS
(
  MIOM     VARCHAR2(15 BYTE),
  SEPE     VARCHAR2(15 BYTE),
  KTHR     VARCHAR2(20 BYTE),
  XML_DOC  SYS.XMLTYPE
)
XMLTYPE COLUMN XML_DOC store  AS clob XMLSCHEMA "SEPE/E8_v1.xsd"  ELEMENT "OvertimesE8" ;

期望如果生成的XML文档没有通过XSD进行验证,INSERT将失败并引发异常。

事实并非如此 -

案例1 - 此字段(性别0:男性,1:女性)

        <xs:element name="f_sex" nillable="false">
            <xs:annotation><xs:documentation>ΦΥΛΟ - (0) ΑΝΤΡΑΣ - (1) ΓΥΝΑΙΚΑ</xs:documentation></xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="0"/>
                    <xs:enumeration value="1"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>

验证按预期工作。如果我尝试在该字段上放置“9”或“X”,则INSERT将被拒绝。

案例2 - 此字段:

        <xs:element name="f_afm" nillable="false">
            <xs:annotation>
                <xs:documentation>ΑΡΙΘΜΟΣ ΦΟΡΟΛΟΓΙΚΟΥ ΜΗΤΡΩΟΥ (Α.Φ.Μ.)</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="([0-9]){9}" />
                    <xs:length value="9" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>

此字段是员工税号,预计为数字且长度恰好为9个数字。

嗯,此字段,即使无效也会始终有效。无论我是否缩短它,无论我是故意用字母字符,INSERT都会成功。

到目前为止,我试过了:

1

ALTER TABLE Devel.Sepe_e8_xmldocs ADD
CONSTRAINT Sepe_e8_xmldocs_c01
 CHECK (Xmlisvalid(Xml_doc) = 1) 
    ENABLE
 VALIDATE;

使用此约束,即使使用有效的XML,INSERT也会一直失败。

2

DECLARE
   Xmldoc   Xmltype;
   ISVALID NUMBER;
BEGIN
   SELECT   X.Xml_doc
     INTO   Xmldoc
     FROM   Sepe_e8_xmldocs X
    WHERE   ROWNUM <= 1;

   ISVALID := Xmldoc.Isschemavalid ('SEPE/E8_v1.xsd');

   IF ISVALID = 1 THEN
      DBMS_OUTPUT.Put_line ('valid');
   ELSE
      DBMS_OUTPUT.Put_line ('NOT VALID');
   END IF;
END;

ISVALID将始终保持为0,即使有效文档也是如此。

DECLARE
   Xmldoc   Xmltype;
   ISVALID NUMBER;
BEGIN
   SELECT   X.Xml_doc
     INTO   Xmldoc
     FROM   Sepe_e8_xmldocs X
    WHERE   ROWNUM <= 1;


   IF Xmlisvalid(Xml_doc) THEN
      DBMS_OUTPUT.Put_line ('valid');
   ELSE
      DBMS_OUTPUT.Put_line ('NOT VALID');
   END IF;
END;

结果:

  

第1行出错   ORA-06550:第11行,第7栏:   PLS-00201:必须声明标识符'XMLISVALID'   ORA-06550:第11行,第4栏:   PL / SQL:忽略语句

...和...

DECLARE
   Xmldoc   Xmltype;
BEGIN
   SELECT   X.Xml_doc
     INTO   Xmldoc
     FROM   Sepe_e8_xmldocs X
    WHERE   ROWNUM <= 1;

   --  xmldoc := xmltype(xml).createSchemaBasedXML('SEPE/E8_v1.xsd');
   Xmldoc.Schemavalidate;
END;

... ...所得

  

LSX-00333:文字“11”对于模式

无效

经过一番研究后,我发现这个月是11个月,其定义是:

    <xs:element name="f_month" nillable="false">
        <xs:annotation><xs:documentation>ΜΗΝΑΣ - (1-12) Ιανουάριος - Δεκέμβριος</xs:documentation></xs:annotation>
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="[1-9]|[1][0-2]"></xs:pattern>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

让我明确说明这个被拒绝的XML验证了在线验证器。

因此,我无法在SQL或PL / SQL中找到方法来针对XSD验证xml文档。

PS。 Oracle版本为11.2.0.4.0

你能帮帮我吗? 谢谢。

0 个答案:

没有答案