ORA-06502:PL / SQL:尝试将XML保存到文件中时出现数字或值错误

时间:2018-07-26 13:23:02

标签: xml database oracle plsql

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

1 个答案:

答案 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来实现。