【问题标题】:ORA-29285 error While exporting data from oracle database to CSV file using procedure使用过程将数据从 oracle 数据库导出到 CSV 文件时出现 ORA-29285 错误
【发布时间】:2016-10-22 15:47:22
【问题描述】:

我在使用过程将数据从 oracle 数据库导出到 CSV 文件时遇到问题。导出数据时,有时 CSV 文件会被截断,并且显示的错误是“ORA-29285 - 文件写入错误”。这里的问题是文件不是一直被截断,而是随机截断。

编辑:下面是我在我的程序中使用的代码块

conn := utl_file.fopen('sample_directory','output.csv','W',4096);
for i in (select * from per_data)
loop
utl_file.put_line(conn,i.name||','||i.sub||','||to_char(i.start_date,'dd-mon-yy')||','||to_char(i.expire_date,'dd-mon-yy')||','||i.loc||CHR(13));
end loop;
utl_file.fclose(conn);`

我正在拉头发寻找原因。有人可以帮帮我吗?

【问题讨论】:

  • 显示您的程序代码可能会有所帮助。你做了什么调试?失败时您尝试写入的数据的长度是多少?
  • 将外部链接粘贴到代码中,发布您的代码图片 - edit您的问题并将代码粘贴为改为文字。
  • @Alex 在这种情况下文件大小重要吗?我正在将数千条记录写入输出。
  • 是的,如果它超过 32k,但你说它有时会工作,有时会在相同的脚本中出错 - 你的意思是完全相同还是不同数量的数据?

标签: oracle csv stored-procedures


【解决方案1】:

出现此错误的一种方法是打开具有特定最大行大小的文件 - possibly the default 1024 - 然后尝试在该文件中写入比该文件更长的一行。

在您的情况下,您似乎没有这样做,因为您使用 4096 打开它并且您的行都(显然)比这短。

所以你可能会点击the 32k limitation

缓冲区参数的最大大小为 32767 字节,除非您在 FOPEN 中指定较小的大小。如果未指定,Oracle 会提供默认值 1024。所有连续 PUT 调用的总和不能超过 32767,而无需中间缓冲区刷新。

你似乎没有做任何冲洗。您可以将 put_line 调用更改为自动刷新:

utl_file.put_line(conn,
  i.name||','||i.sub||','||to_char(i.start_date,'dd-mon-yy')
    ||','||to_char(i.expire_date,'dd-mon-yy')||','||i.loc||CHR(13),
  true);

或者在你的循环中保留一个计数器,每 100 行 manually flush(或任何对你有效且有效的数字)。

As noted in the documentation:

如果 FCLOSE 运行时有缓冲数据尚未写入,则关闭文件时可能会收到 WRITE_ERROR。

您在关闭之前不会刷新,因此添加显式刷新 - 即使您将 autoflush 设置为 true - 也可能有助于避免这种情况,至少如果异常是由 fclose() 调用而不是由put_line():

...
end loop;
utl_file.fflush(conn);
utl_file.fclose(conn);

【讨论】:

  • utl_file.fopen(sample_directory,output.csv,'W',4096); 我认为我使用的行大小大于我写入文件的大小。我的输出是:Nick,F1333,19-JAN-13,19-JAN-99,IN。如果我再次运行相同的脚本,我得到的输出非常好。
  • 您是否在输出中添加换行符 - 如果您的操作系统需要这些回车符,则返回?你写了多少条记录?如果完全相同的输出间歇性地工作,这很奇怪。请将程序代码添加到问题中,这样我们就不必猜测您在做什么。
  • 是的!我在输出中添加回车。输出包含数千条记录(特别是 80k+)。这是否取决于我写入输出的记录数?这真的很奇怪,我不知道为什么当我再次运行它时会得到正确的输出。这是一个常见的问题。
  • per_data 中的数据是否在运行之间发生变化?
  • 我在再次运行脚本时使用了相同的数据,没有任何更改。
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2012-12-22
相关资源
最近更新 更多