我正在生成一个必须符合标准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
你能帮帮我吗? 谢谢。