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

Posted

技术标签:

【中文标题】ORA-06502: PL/SQL: 尝试将 XML 保存到文件时出现数字或值错误【英文标题】:ORA-06502: PL/SQL: numeric or value error when trying to save XML into file 【发布时间】:2018-07-26 13:23:02 【问题描述】:

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

【问题讨论】:

您使用的是哪个版本的Oracle,哪一行抛出异常?在问题中包含整个异常堆栈可能很有用。 使用 ORACLE 10g,此行抛出异常:UTL_FILE.PUT (FILE_TO_SAVE, XMLCLOB)。全栈:[错误]执行(1:3):ORA-06502:PL/SQL:数字或值错误ORA-06512:在“SAVE_XML_TO_FILE”,第7行 【参考方案1】:

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;
/

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

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

【讨论】:

感谢您的帮助。是的,XML 没有换行符,所以我在 XML 生成的末尾添加了 .extract('/*'),现在一切正常

以上是关于ORA-06502: PL/SQL: 尝试将 XML 保存到文件时出现数字或值错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值

ORA 06502 错误 PL/SQL

ORA-06502: PL/SQL: 数字或值错误: 数字精度太大

PL/SQL - 防止 ORA-06502

错误 ORA-06502:PL/SQL:数字或值错误:字符到数字的转换错误 ORA-06512:在第 22 行

oracle ORA-06502:PL/SQL:数字或值错误:批量绑定:截断绑定