ORA-06502:PL/SQL:尝试将XML保存到文件时出现数字或值错误
我试图将使用函数GENERATE_XML_从_表创建的XMLTYPE数据保存到文件中。当我尝试保存少量字符时,一切正常。但对于较大的大小,它会导致错误“当试图将XML保存到文件中时出现数字或值错误”ORA-06502:PL/SQL:尝试将XML保存到文件时出现数字或值错误,xml,database,oracle,plsql,Xml,Database,Oracle,Plsql,我试图将使用函数GENERATE_XML_从_表创建的XMLTYPE数据保存到文件中。当我尝试保存少量字符时,一切正常。但对于较大的大小,它会导致错误“当试图将XML保存到文件中时出现数字或值错误” 的缓冲区的最大大小为32767,除非在fopen()中指定了较小的大小;默认的最大行大小为1024个字符 基本上,您需要将CLOB分块写入,还可以使用更大的缓冲区: PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2) IS FILE_TO_SA
的缓冲区的最大大小为32767,除非在
fopen()
中指定了较小的大小;默认的最大行大小为1024个字符
基本上,您需要将CLOB分块写入,还可以使用更大的缓冲区:
PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2)
IS
FILE_TO_SAVE UTL_FILE.FILE_TYPE;
XMLCLOB CLOB;
POSITION PLS_INTEGER := 1;
CHARS PLS_INTEGER := 32767;
BUFFER VARCHAR2(32767);
BEGIN
XMLCLOB := GENERATE_XML_FROM_TABLE (TARGET_TABLE).GETCLOBVAL ();
FILE_TO_SAVE := UTL_FILE.FOPEN ('DATA', 'CLASSIF.xml', 'W', CHARS);
WHILE POSITION < DBMS_LOB.GETLENGTH (XMLCLOB) LOOP
DBMS_LOB.READ (XMLCLOB, CHARS, POSITION, BUFFER);
UTL_FILE.PUT (FILE_TO_SAVE, BUFFER);
UTL_FILE.FFLUSH (FILE_TO_SAVE);
POSITION := POSITION + CHARS;
END LOOP;
UTL_FILE.FCLOSE (FILE_TO_SAVE);
END;
/
过程将XML保存到文件(目标表格VARCHAR2)
是
文件\保存UTL\ U文件。文件\类型;
XMLCLOB-CLOB;
位置PLS_整数:=1;
字符PLS_整数:=32767;
缓冲区VARCHAR2(32767);
开始
XMLCLOB:=从_表(TARGET_表)生成_XML_;
要保存的文件:=UTL\u FILE.FOPEN('DATA','CLASSIF.xml','W',CHARS);
而位置
我在``fopen()`调用中添加了CHARS
,因此将是32767。然后,我将CLOB以32767个字符的数据块读入缓冲区,然后写入并——重要的是——刷新每个缓冲区
如果CLOB中的XML没有换行符,您仍然会遇到问题,但希望它是经过修饰的;如果没有,您可以在编写之前使用XMLSerialise来实现这一点。您使用的是Oracle的哪个版本,以及哪一行引发异常?在问题中包含整个异常堆栈可能会很有用。使用ORACLE 10g,此行抛出异常:UTL_FILE.PUT(FILE_TO_SAVE,XMLCLOB)。完整堆栈:[错误]执行(1:3):ORA-06502:PL/SQL:数字或值错误ORA-06512:“将XML保存到文件”第7行谢谢您的帮助。是的,XML没有换行符,所以我在XML generate的末尾添加了.extract('/*'),现在一切正常了
PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2)
IS
FILE_TO_SAVE UTL_FILE.FILE_TYPE;
XMLCLOB CLOB;
POSITION PLS_INTEGER := 1;
CHARS PLS_INTEGER := 32767;
BUFFER VARCHAR2(32767);
BEGIN
XMLCLOB := GENERATE_XML_FROM_TABLE (TARGET_TABLE).GETCLOBVAL ();
FILE_TO_SAVE := UTL_FILE.FOPEN ('DATA', 'CLASSIF.xml', 'W', CHARS);
WHILE POSITION < DBMS_LOB.GETLENGTH (XMLCLOB) LOOP
DBMS_LOB.READ (XMLCLOB, CHARS, POSITION, BUFFER);
UTL_FILE.PUT (FILE_TO_SAVE, BUFFER);
UTL_FILE.FFLUSH (FILE_TO_SAVE);
POSITION := POSITION + CHARS;
END LOOP;
UTL_FILE.FCLOSE (FILE_TO_SAVE);
END;
/