6

我正在从 Oracle 存储过程编写一个 > 7MB 的大文件,并且要求在每条记录的末尾没有行终止字符(没有回车/换行)。

我已经使用 UTL_FILE.PUT 编写了一个存储过程,并且我正在使用 UTL_FILE.FFLUSH 跟踪对 UTL_FILE.PUT 的每次调用。尽管我正在进行 FFLUSH 调用,但一旦我写入的内容超过缓冲区大小(设置为最大 32767),此过程就会出现写入错误。如果我用 PUT_LINE 调用替换 PUT 调用,该过程可以正常工作。

没有换行符就不能写超过缓冲区大小吗?如果是这样,是否有解决方法?

4

4 回答 4

4

Dustin,

The Oracle documentation here: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

States that: FFLUSH physically writes pending data to the file identified by the file handle. Normally, data being written to a file is buffered. The FFLUSH procedure forces the buffered data to be written to the file. The data must be terminated with a newline character.

The last sentence being the most pertinent.

Could you not write the data using UTL_FILE.PUT_LINE before then searching the resulting file for the line terminators and removing them?

Just a thought....

于 2011-08-26T14:51:30.877 回答
4

从文档中删除引用,请参阅 Ollie 的回答

另一种可能的方法是 Java 存储过程,您可以在其中使用功能更全面的 Java API 来创建和写入文件。

于 2011-08-26T14:55:01.253 回答
1

尽管它不太理想,但您始终可以PUT直到检测到您接近缓冲区大小。发生这种情况时,您可以处理文件(刷新缓冲区)并使用(附加)作为模式FCLOSE重新打开同一个文件。同样,通常应该避免使用这种技术,特别是如果其他进程也试图访问该文件(例如:关闭文件通常会撤销该进程对其施加的任何锁,从而释放任何其他试图获取锁的进程)。FOPEN'a'

于 2011-08-27T12:17:06.357 回答
0

感谢所有伟大的回应,他们非常有帮助。Java 存储过程看起来像是要走的路,但由于我们内部没有很多 Java 专业知识,因此管理层会不赞成。但是,我能够从存储过程中找到一种方法来做到这一点。我不得不以写字节模式“WB”打开文件。然后,对于我写入文件的每条记录,我使用 UTL_RAW.CAST_TO_RAW 将其转换为 RAW 数据类型。然后使用 UTL_FILE.PUT_RAW 写入文件,然后调用任何必要的 FFLUSH 来刷新缓冲区。接收系统已经能够读取文件;到目前为止,一切都很好。

于 2011-08-30T11:33:23.237 回答