我正在尝试使用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;