我的 PL/SQL 过程中有以下代码,我在 API_XXX.put 中调用了它(它调用utl_file.put
)在 while 循环中。 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))。
I read Oracle PL/SQL UTL_FILE.PUT 缓冲。我发现这是同样的原因,我的 l_xmldoc 非常大,当我循环它时,我发现它没有换行符,所以缓冲区高达 32767,即使我每次都 fflush。
那么,我应该如何将 l_xmldoc 转换为带有换行符的 varchar 。
PS:我确认我的客户正在使用Oracle 11g