- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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
最佳答案
发布您正在使用的 Oracle 版本!或者我们可以猜测...
您的 fflush
将无法按您的预期工作 - 来自 documentation :
FFLUSH 将挂起的数据物理写入由文件句柄标识的文件。通常,写入文件的数据会被缓冲。 FFLUSH 过程强制将缓冲数据写入文件。 数据必须以换行符终止。
tbone 绝对正确,而 TO_CHAR(10) 行是错误的!只需尝试SELECT TO_CHAR(10) FROM DUAL;
,您将得到10
,然后将其与单个字符进行比较。单个字符永远不会是“10”,因为 10 有两个字符!
您的问题很可能是 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/
我的 PL/SQL 过程中有以下代码,我在 while 循环中在 API_XXX.put 中调用了该代码(它调用 utl_file.put )。 l_xmldoc 是来自 getReportXML 函
我已经研究这件事好几天了,这让我发疯了。 我有一个使用 UTL_FILE 写入文件的 oracle 程序. 我曾经将我的值存储为 NVARCHAR2 并使用 UTL_FILE.PUT_LINE_NCH
我有 PL/SQL block ,它从表函数查询,我使用游标逐条记录地处理它,有一些业务逻辑,最后将合格记录写入文件。 要处理的记录数高达 100 万条。总处理速度约为每分钟10000条记录。(经过少
我们在 Oracle 10g 中使用 utl_file 将 blob 从表行复制到文件系统上的文件,当我们调用 utl_file.fclose() 时需要很长时间。这是一个 10mb 的文件,不是很大
我必须编写一个程序,使用 fseek 从特定位置读取数据。我必须逐行读取数据,并且在特定行中我必须使用 fseek 来读取数据。但是当我使用fseek并且absolute_offset很大(比文件大小
我正在尝试写入存储在 c:\驱动器中名为 vin1.txt 的文件并收到此错误。请提出建议! > ERROR at line 1: ORA-29280: invalid > directory pat
我开始使用 mySQL 存储过程,并且需要使用 UTL_FILE 包转换为 Oracle Database 11gR2 创建的一些过程以生成执行日志。 谁能帮我,告诉我mySQL中是否有类似的形式?
我是一名报告分析师,他被要求学习一些 PL/SQL 来自动化某些流程。所以我快要完成了,但有一步挡住了。我有一个包 加载包含我编写的查询的表。 将该表中的结果导出到服务器上的 .txt 文件,并将 c
您好,我正在运行 Oracle 11,我正在尝试使用 UTL_FILE.FOPEN 写入服务器机器上的目录。 为了对此进行测试,我使用了以下脚本(包括输出): SQL> @D:\test.sql de
您好,我正在运行 Oracle 11,我正在尝试使用 UTL_FILE.FOPEN 写入服务器机器上的目录。 为了对此进行测试,我使用了以下脚本(包括输出): SQL> @D:\test.sql de
我有一个 oracle 过程,它使用 UTL_FILE.FOPEN 函数创建一个文本文件。该文件是使用权限 660 创建的。如何在不使用 chmod 的情况下更改文件的权限?(我无权访问服务器) 最佳
我正在尝试从 plsq 获取文件句柄,我正在尝试查看是否可以测试 plsql 包来自 Java 我有这段代码: Properties props = Utils.readProps("database
我创建了一个包含大量数据的 xml。现在我正在尝试将生成的 xml 写入文件。 声明: prodFeed_file UTL_FILE.FILE_TYPE; prodFeed_file := UTL_
我正在从 Oracle 存储过程写入一个大于 7MB 的大文件,并且要求在每条记录的末尾没有行终止字符(没有回车/换行)。 我已经使用 UTL_FILE.PUT 编写了一个存储过程,并且我正在使用 U
本题是在PL/SQL中执行UTL_FILE.FOPEN命令。 UTL_FILE.FOPEN 是在客户端还是服务器端打开文件? 假设我在我的机器 A 上运行 Oracle 客户端 10,我正在连接机器
我遇到一个问题,我无法使用外部表读取简单文件,也无法使用 UTL_FILE 写入文件。我认为这与权限有关,但我无法弄清楚。 我确认 APPS 和 PUBLIC 有足够的权限: select GRANT
我正在使用 ExcelDocTypeUtils pkg 将查询数据导出到 EXCEL 文件。 当我运行该程序时,我得到一个 excel 文件,但是当我尝试打开它时,会弹出此错误:Program cam
我现在的场景是这样的: 我需要从shell 脚本登录到sqlplus来调用存储过程。 之后,我需要通过 SPOOLING 表中的数据创建一个 CSV 文件。 然后我需要在特定目录中检查是否已创建 CS
我在存储在某个预定义目录中的 Excel 表中写入数据没有问题。 现在我有 10 组数据,对于每组数据,我必须创建 10 个单独的 excel 表。 但我想要的是创建工作簿 conating shee
我有一个脚本可以从 Oracle BLOB 表中提取大量文档。这对于从 Oracle 到 SQL 的大量重写和数据库转换是必要的,其中文件将存储在 SQL 文件表中。由于文档必须位于文件系统中,我必须
我是一名优秀的程序员,十分优秀!