Почему DBMS_XMLSCHEMA не может проверить действительный xs: dateTime? - PullRequest
0 голосов
/ 16 июня 2011

Я собираюсь проверить и обработать 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 value, а DBMS_XMLSCHEMA вообще не должна на это жаловаться.Валидация также должна быть независимой от любых настроек формата даты базы данных, верно?

Так что же это за странность Oracle, и если да, то какие обходные пути?Или я должен настроить Oracle и / или DBMS_XMLSCHEMA по-разному?Или я что-то неверно истолковал или ...

Я использую Oracle Database 11g Release 11.2.0.1.0.

Если что-то стоит, приведенная выше примерная XML-схема и данные корректно проверяются с помощью exchangerxml , использующий Xerces.

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Я думаю, вы можете это исправить, добавив:

xdb:SQLType="TIMESTAMP WITH TIME ZONE"

к элементу в схеме XML.Хотя это может привести к ошибке в записях, не относящихся к часовому поясу ...

0 голосов
/ 17 июня 2011

Это просто коллекция соответствующей документации Oracle, которая отвечает на мой вопрос. Я принял ответ Фила, когда нашел правильный раздел документации, основанный на этом.

Из главы 7 Хранилище XML-запросов и запросы: основные из Руководство разработчика Oracle XML DB 11g, выпуск 2 (11.2) :

Работа с часовыми поясами

Следующие типы данных схемы XML допускают использование дополнительного индикатора часового пояса как части их литеральных значений.

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

По умолчанию регистрация XML-схемы сопоставляет xsd:dateTime и xsd:time с типом данных SQL TIMESTAMP, а все остальные типы данных - с типом данных SQL DATE. Типы данных SQL TIMESTAMP и DATE не разрешают указатель часового пояса.

Если вашему приложению нужно работать с индикаторами часового пояса, используйте атрибут 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"/>

Использование Trailing 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.

Смотри также:

...