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

时间:2011-06-16 09:55:16

标签: oracle validation datetime xsd oracle11g

我将验证和处理第三方提供的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>

以下XML的验证:

<?xml version="1.0" encoding="UTF-8"?>
<datetime-issue>
  <time>2011-06-15T16:58:23</time>
  <!-- Oracle doesn't like timezone ? -->
  <time>2011-06-15T16:58:23+02:00</time>
  <time>2011-06-16T09:55:01</time>
</datetime-issue>

第二个时间元素意外失败:

ORA-30992: error occurred at Xpath /datetime-issue/time[2]
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at "SYS.XMLTYPE", line 354

AFAICS 2011-06-15T16:58:23+02:00应该是有效的XML架构xs:dateTime值,DBMS_XMLSCHEMA不应该抱怨它。验证也应该独立于任何数据库日期格式设置,对吗?

这是Oracle的怪癖,如果是,那么解决方法是什么?或者我应该以不同方式配置Oracle和/或DBMS_XMLSCHEMA?或者我误解了某些东西或......

我正在运行Oracle Database 11g第11.2.0.1.0版。

如果值得做任何事情,上面的示例XML架构和数据都会使用Xerces exchangerxml正确验证。

2 个答案:

答案 0 :(得分:1)

我认为你可以通过添加:

来解决这个问题
xdb:SQLType="TIMESTAMP WITH TIME ZONE"

到XML模式中的元素。虽然这可能是非时区记录的错误......

答案 1 :(得分:0)

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

7 XML Schema Storage and Query: BasicOracle XML DB Developer's Guide 11g Release 2 (11.2)章:

  

使用时区

     

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

     
      
  • xsd:dateTime
  •   
  • xsd:time
  •   
  • xsd:date
  •   
  • xsd:gYear
  •   
  • xsd:gMonth
  •   
  • xsd:gDay
  •   
  • xsd:gYearMonth
  •   
  • xsd:gMonthDay
  •   
     

默认情况下,XML架构注册将xsd:dateTimexsd:time映射到SQL数据类型TIMESTAMP,将所有其他数据类型映射到SQL数据类型DATE。 SQL数据类型TIMESTAMPDATE不允许使用时区指示符。

     

如果您的应用程序需要使用时区指示符,则使用属性SQLType将SQL数据类型指定为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"/>
     

使用尾随Z表示UTC时区

     

XML Schema允许将时区组件指定为Z,以指示UTC时区。当具有尾随Z的值存储在SQL TIMESTAMP WITH TIME ZONE列中时,时区实际存储为+00:00。因此,检索到的值包含尾随+00:00,而不是原始Z。例如,如果输入XML文档中的值为1973-02-12T13:44:32Z,则输出为1973-02-12T13:44:32.000000+00:00

另见: