gpt4 book ai didi

sql - 在循环中调用 utl_file.put 时 UTL_FILE.WRITE_ERROR

转载 作者:行者123 更新时间:2023-12-02 12:57:22 29 4
gpt4 key购买 nike

我的 PL/SQL 过程中有以下代码,我在 while 循环中在 API_XXX.put 中调用了该代码(它调用 utl_file.put )。 l_xmldoc 是来自 getReportXML 函数的 CLOB,该函数返回 xml clob。

我编写的将 xml 写入文件的代码如下:

l_offset := 1;
WHILE (l_offset <= l_length)
LOOP
l_char := dbms_lob.substr(l_xmldoc,1,l_offset);

IF (l_char = to_char(10)) ---I also tried if (l_char=chr(10)) but it did not work
THEN
API_XXXX.new_line(API_XXX.output, 1);
ELSE
API_XXXX.put(fnd_API_XXX.output, l_char);
END IF;

l_offset := l_offset + 1;
END LOOP;

请注意,API_XXX 是我无法修改的现有包,并且此 api 调用 fflush最后put .

API_XXX.put的部分如下(“WHICH”是第一个参数):

         elsif WHICH = API_XXX.OUTPUT then
temp_file := OUT_FNAME;
utl_file.put(F_OUT, BUFF);
utl_file.fflush(F_OUT);

API_XXX.new_line就像(LINES是要写入的行数):

         elsif WHICH = API_XXX.OUTPUT then
temp_file := OUT_FNAME;
utl_file.new_line(F_OUT, LINES);
utl_file.fflush(F_OUT);

我注意到客户这边的 put/new_line 过程有时会引发 UTL_FILE.WRITE_ERROR由于未知原因(可能是由于我的客户的 while 循环中的 l_length 太大(最多 167465))。

我读到Oracle PL/SQL UTL_FILE.PUT buffering。我发现这是同样的原因,我的 l_xmldoc 非常大,当我循环它时,我发现它没有换行符,所以缓冲区高达 32767,即使我每次 fflush。

那么,我应该如何将 l_xmldoc 转换为带有换行符的 varchar。

PS:我确认我的客户正在使用 Oralce 11g

最佳答案

  1. 发布您正在使用的 Oracle 版本!或者我们可以猜测...

  2. 您的 fflush 将无法按您的预期工作 - 来自 documentation :

    FFLUSH 将挂起的数据物理写入由文件句柄标识的文件。通常,写入文件的数据会被缓冲。 FFLUSH 过程强制将缓冲数据写入文件。 数据必须以换行符终止。

  3. tbone 绝对正确,而 TO_CHAR(10) 行是错误的!只需尝试SELECT TO_CHAR(10) FROM DUAL;,您将得到10,然后将其与单个字符进行比较。单个字符永远不会是“10”,因为 10 有两个字符!

  4. 您的问题很可能是 XML 文件太大导致缓冲区溢出,但请记住,目标系统上的其他问题也可能导致 write_errors,应该对此进行处理。

    <

解决方案

  • Quick&Dirty:由于您似乎并不关心性能,因此您可以每隔 X 字节关闭文件并使用 A 重新打开它进行追加。所以只需添加到循环中即可:

    IF MOD( l_offset, 32000 ) = 0
    THEN
    UTL_FILE.FCLOSE( f_out );
    UTL_FILE.FOPEN( out_fpath, out_fname, f_out, 'a', 32767 );
    END IF;
  • 使用正确的工具完成正确的工作:UTL_FILE 不适合处理复杂的数据。 UTL_FILE 的唯一用例是用换行符分隔的小文本行。对于其他所有内容,您应该写入原始字节! (这也将允许您对编码进行适当的控制,目前这只是一个迷你的幸运猜测)

  • 使用 NIO-Filechannels 编写 Java 存储过程 - 快速、安全、美观...但是要小心,您的程序运行速度可能会快 10 倍!

关于sql - 在循环中调用 utl_file.put 时 UTL_FILE.WRITE_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25279365/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com