我在我的 PL/SQL 过程中有以下代码,我utl_file.put
在一个 while 循环中调用了 API_XXX.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 是我无法修改的现有包,并且此apifflush
在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 缓冲 。我发现这是同样的原因,我的 l_xmldoc 非常大,当我循环它时,我发现它没有新的行终止符,所以即使我每次都 fflush,缓冲区也高达 32767。
那么,我应该如何将 l_xmldoc 转换为带有新行终止符的 varchar。
PS:我确认我的客户使用的是 Oralce 11g