首页 > 解决方案 > ORA-06502: PL/SQL: 尝试将 XML 保存到文件时出现数字或值错误

问题描述

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

标签: xmldatabaseoracleplsql

解决方案


缓冲区的最大大小为32767,除非在;put()中指定了较小的大小。fopen()默认max_line_sizefopen()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;
/

我已经添加CHARS到“fopen()”调用中,所以这将是 32767。然后我将 CLOB 以最多 32767 个字符的块读取到缓冲区中,并写入 - 重要的是 - 刷新每个缓冲区。

如果 CLOB 中的 XML 没有换行符,您仍然会遇到问题,但希望它被美化了;如果不是,您可以在编写之前使用 XMLSerialise 来实现。


推荐阅读