2011-06-16 33 views
0

我將驗證並處理由第三方提供的XML。 XML符合也由第三方提供的標準化XML模式。爲什麼DBMS_XMLSCHEMA無法驗證有效的xs:dateTime?

爲了驗證我用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 value和DBMS_XMLSCHEMA不應該抱怨臨時表一點都不。驗證也應該獨立於任何數據庫日期格式設置,對嗎?

那麼,這是一個Oracle怪癖,如果是的是什麼是解決方法?或者我應該以不同的方式配置Oracle和/或DBMS_XMLSCHEMA?或者我誤解了某些東西或...

我正在運行Oracle數據庫11g版本11.2.0.1.0。

如果上面的示例XML模式和數據值得使用Xerces的exchangerxml正確驗證。

回答

1

我想你可以通過添加修復:

xdb:SQLType="TIMESTAMP WITH TIME ZONE" 

在XML架構的元素。雖然這可能會在非時區記錄上出現錯誤...

+0

當我添加了[XML模式註釋](http://download.oracle.com/docs /cd/E11882_01/appdev.112/e16659/xdb05sto.htm#i1030452)到驗證通過的示例,並且沒有元素缺失的問題可選時區。另請參見[將XML模式數據類型映射到SQL數據類型](http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16659/xdb05sto.htm#i1030995)。問題是註釋是特定於Oracle的,XML模式由第三方管理。但如何克服這一限制值得再次進行辯論。 – user272735 2011-06-17 06:05:37

0

這只是一個相關的Oracle文檔集合,它回答了我的問題。我接受了菲爾的答案,因爲我發現了基於此的正確的文檔部分。

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

與時區

下面的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架構讓時區組件被指定爲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

參見: