我正在尝试将使用函数GENERATE_XML_FROM_TABLE创建的XMLTYPE数据保存到文件中。当我尝试保存少量字符时,所有字符都可以使用。但是,对于较大的尺寸,会导致错误“尝试将XML保存到文件时出现数字或值错误”。
PROCEDURE SAVE_XML_TO_FILE (TARGET_TABLE VARCHAR2)
IS
FILE_TO_SAVE UTL_FILE.FILE_TYPE;
XMLCLOB CLOB;
BEGIN
XMLCLOB := GENERATE_XML_FROM_TABLE (TARGET_TABLE).GETCLOBVAL ();
FILE_TO_SAVE := UTL_FILE.FOPEN ('DATA', 'CLASSIF.xml', 'W');
UTL_FILE.PUT (FILE_TO_SAVE, XMLCLOB);
UTL_FILE.FCLOSE (FILE_TO_SAVE);
END;
答案 0 :(得分:0)
put()
的缓冲区的最大大小为32767,除非在fopen()
中指定了较小的大小;并且fopen()
的默认max_line_size
是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;
/
我在{open()`调用中添加了CHARS
,所以它将是32767。然后,我将CLOB读入缓冲区(最多32767个字符),并写和-重要的是-刷新每个缓冲区。
如果CLOB中的XML没有换行符,您仍然会遇到问题,但是希望它已经美化了;如果没有,您可以在编写之前使用XMLSerialise来实现。