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: 数字或值错误: 数字精度太大