xml - 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;
解决方案
缓冲区的最大大小为32767,除非在;put()
中指定了较小的大小。fopen()
默认max_line_size
为fopen()
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 来实现。
推荐阅读
- sql - 如何对 sql 连接进行聚合?
- docker - Start.Process() .net Core 在 Linux Docker 中不起作用
- hyperledger-fabric - 如何使用成员 CA 身份进行超级账本结构交易
- java - 工作区中没有安装 JRE 来启动 spring
- button - 如何在 libgdx 中单击一次按钮?
- c# - 使用 WPF webbrowser 和带有斜体标签和阿拉伯文本的 HTML 时出现奇怪的字符
- node.js - 使用 node.js 的 HTTP “重定向” - 有模块吗?
- reactjs - React-i18next - HTML锚点 href 保存
- javascript - 如何在按钮单击时重定向到另一个页面
- arm-template - 无法安装 LAD 3.0 扩展