Oracle XSD - ORA-01830:日期格式图片在转换整个输入字符串之前结束

时间:2016-05-27 16:14:41

标签: xml oracle xsd

我收到错误ORA-01830:日期格式图片在XMLType对象上执行schemaValidate()时转换整个输入字符串之前结束。

这是因为以下日期:“2016-05-26T16:37:42Z”,但当我删除Z并将其保留为“2016-05-26T16:37:42”时,它可以正常工作。

为什么会这样?我需要使用区域值运行该进程,因为我无法更改传入的文件,这是需求的一部分。此外,它使用SSIS正确运行,但我需要它在Oracle PL / SQL中运行。

这是我的代码:

DECLARE
   v_schema_url   VARCHAR2 (200) := 'Test.xsd';
   v_blob         BLOB;
   v_clob         CLOB;
   v_xml          XMLTYPE;
   xml_file BFILE;
   xmlClob CLOB;

   src_offset number := 1 ;
   dest_offset number := 1 ;
   lang_ctx number := DBMS_LOB.DEFAULT_LANG_CTX;
   warning integer;
   res integer;
BEGIN
   dbms_xmlschema.deleteschema(v_schema_url); 
   DBMS_XMLSCHEMA.registerschema (schemaurl   => v_schema_url,
                                  schemadoc   => bfilename ('DIR_XSD','Test.xsd'),
                                  local       => TRUE);
   xml_file := BFILENAME('DIR_XSD', 'test.xml');
   DBMS_LOB.CREATETEMPORARY(xmlClob, true);
   DBMS_LOB.FILEOPEN(xml_file, DBMS_LOB.FILE_READONLY);
   DBMS_LOB.LOADCLOBFROMFILE(xmlClob, xml_file, DBMS_LOB.LOBMAXSIZE, src_offset,
                             dest_offset, DBMS_LOB.DEFAULT_CSID, lang_ctx, warning);

   v_xml := XMLType.createXML(xmldata=>xmlClob,schema=>v_schema_url);

   DBMS_LOB.FILECLOSEALL();
   DBMS_LOB.FREETEMPORARY(xmlClob);

   v_xml.schemaValidate();

   IF v_xml.isschemavalid (v_schema_url) = 1 THEN
      DBMS_OUTPUT.put_line ('valid');
   ELSE
      DBMS_OUTPUT.put_line ('not valid');
   END IF;
END;

1 个答案:

答案 0 :(得分:1)

通过在DateTime定义中添加以下内容来修复它:

xdb:SQLType="TIMESTAMP WITH TIME ZONE"

还需要将以下内容添加到顶层架构定义中:

xmlns:xdb="http://xmlns.oracle.com/xdb"