我正在写一个大文件>来自Oracle存储过程的7MB,并且要求在每条记录的末尾没有行终止字符(没有回车符/换行符)。
我使用UTL_FILE.PUT编写了一个存储过程,并且我正在使用UTL_FILE.FFLUSH跟踪每次调用UTL_FILE.PUT。虽然我正在进行FFLUSH调用,但是当我写入超过缓冲区大小(设置为max 32767)的点时,此过程会出现写入错误。如果我用PUT_LINE调用替换PUT调用,该过程可以正常工作。
如果没有换行符,是否无法写入超过缓冲区大小的内容?如果是这样,有解决方法吗?
答案 0 :(得分:4)
达斯汀,
此处的Oracle文档: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404
说明: FFLUSH将待处理数据物理写入文件句柄标识的文件。通常,写入文件的数据是缓冲的。 FFLUSH过程强制将缓冲的数据写入文件。必须使用换行符终止数据。
最后一句是最相关的。
您是否可以使用UTL_FILE.PUT_LINE编写数据,然后在结果文件中搜索行终止符并删除它们?
只是一个想法......
答案 1 :(得分:4)
从文档中删除了引用,请参阅Ollie的回答
另一种可能的方法是使用Java存储过程,您可以使用功能更全面的Java API来创建和写入文件。
答案 2 :(得分:1)
尽管不太理想,但在检测到您接近缓冲区大小之前,您可以始终PUT
。发生这种情况时,您可以FCLOSE
文件句柄(刷新缓冲区)并使用FOPEN
(追加)作为模式,使用'a'
重新打开该文件。同样,通常应避免使用此技术,特别是如果其他进程也尝试访问该文件(例如:关闭文件通常会撤消进程对其进行的任何锁定,从而释放尝试获取锁定的任何其他进程)。
答案 3 :(得分:0)
感谢所有出色的回复,他们非常乐于助人。 java存储过程看起来像是要走的路,但由于我们内部没有很多java专业知识,所以管理层会不满意。但是,我能够从存储过程中找到一种方法。我必须以写字节模式'WB'打开文件。然后,对于我正在写入文件的每条记录,我使用UTL_RAW.CAST_TO_RAW将其转换为RAW数据类型。然后使用UTL_FILE.PUT_RAW写入文件,然后进行任何必要的FFLUSH调用以刷新缓冲区。接收系统已经能够读取文件;到目前为止一切顺利。