Oracle通过XSD验证XML:ORA-04030:尝试分配1032字节时的进程外内存

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

标签: xml oracle xsd

我正在尝试使用Oracle PL / SQL通过XSD验证XML。它适用于较小的文件,但不适用于较大的文件。我收到以下错误:

1:ORA-04030:尝试分配1032个字节时的进程外内存(qmxlu subheap,qmemNextBuf:alloc)

我搜索它应该是因为参数PGA_AGGREGATE_TARGET,根据我们的DBA它是:

pga_aggregate_target                 integer  0

可以看出它是无限的,我试图验证的xml文件是500 MB。

导致此错误的原因是什么?我该如何解决?

这是我的代码,我的预期输出是"有效":

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(); --it fails here

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

0 个答案:

没有答案