Oracle 为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime?

Oracle 为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime?,oracle,validation,datetime,xsd,oracle11g,Oracle,Validation,Datetime,Xsd,Oracle11g,我将验证和处理第三方提供的XML。XML符合第三方提供的标准化XML模式 对于验证,我使用DBMS_XMLSCHEMA的基本方式如下: -- pseudocode follows declare xmldoc xmltype; begin dbms_xmlschema.registerschema(schemaurl => name, schemadoc => xmltype(schema),

我将验证和处理第三方提供的XML。XML符合第三方提供的标准化XML模式

对于验证,我使用DBMS_XMLSCHEMA的基本方式如下:

-- pseudocode follows
declare
  xmldoc xmltype;
begin
  dbms_xmlschema.registerschema(schemaurl => name,
                                schemadoc => xmltype(schema),
                                local => true,
                                gentypes => false,
                                gentables => false
                                );
  xmldoc := xmltype(xml).createSchemaBasedXML(schema_name);
  xmldoc.schemavalidate;
end;
验证似乎是有效的,只是我运行了一个XML模式类型
xs:dateTime
的问题,如下所示

使用XML模式:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="datetime-issue">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="time" type="xs:dateTime" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
AFAICS
2011-06-15T16:58:23+02:00
应该是一个有效的XML模式值,DBMS_XMLSCHEMA不应该对此抱怨。验证也应该独立于任何数据库日期格式设置,对吗

那么,这是否是Oracle的一个怪癖?如果是,解决办法是什么?或者我应该以不同的方式配置Oracle和/或DBMS_XMLSCHEMA吗?或者我误解了什么或者

我正在运行Oracle Database 11g 11.2.0.1.0版


如果值得一提的话,上面的示例XML模式和数据使用Xerces进行了正确验证。

我认为您可以通过添加以下内容来解决这一问题:

xdb:SQLType="TIMESTAMP WITH TIME ZONE"

指向XML架构中的元素。虽然这可能会在非时区记录上出错…

这只是一个相关Oracle文档的集合,可以回答我的问题。我接受了Phil的回答,因为我找到了基于此的文档的正确部分

从第章:

使用时区

以下XML架构数据类型允许将可选时区指示符作为其文字值的一部分

  • xsd:dateTime
  • xsd:time
  • xsd:date
  • xsd:gYear
  • xsd:gMonth
  • xsd:gDay
  • xsd:gyearmount
  • xsd:gMonthDay
默认情况下,XML模式注册将
xsd:dateTime
xsd:time
映射到SQL数据类型
TIMESTAMP
,并将所有其他数据类型映射到SQL数据类型
DATE
。SQL数据类型
时间戳
日期
不允许时区指示器

如果应用程序需要使用时区指示符,则使用属性
SQLType
将SQL数据类型指定为
TIMESTAMP with timezone
。这可以确保包含时区指示器的值可以正确存储和检索。例如:

<element name="dob" type="xsd:dateTime"
      xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
<attribute name="endofquarter" type="xsd:gMonthDay"
       xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>


  • 当我将其添加到示例中时,验证通过了,元素缺少可选时区没有问题。另见。问题在于注释是特定于Oracle的,XML模式由第三方管理。但如何克服这一限制值得另一场辩论。
    xdb:SQLType="TIMESTAMP WITH TIME ZONE"
    
    <element name="dob" type="xsd:dateTime"
          xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
    <attribute name="endofquarter" type="xsd:gMonthDay"
           xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>