【问题标题】:Oracle PL/SQL UTL_FILE.PUT bufferingOracle PL/SQL UTL_FILE.PUT 缓冲
【发布时间】:2022-01-13 02:53:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: oracle plsql put fflush utl-file


    【解决方案1】:

    达斯汀,

    这里的 Oracle 文档: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

    声明: FFLUSH 将挂起的数据物理写入由文件句柄标识的文件。通常,写入文件的数据会被缓冲。 FFLUSH 过程强制将缓冲数据写入文件。数据必须以换行符结束。

    最后一句话最贴切。

    您能不能先使用 UTL_FILE.PUT_LINE 写入数据,然后再在结果文件中搜索行终止符并删除它们?

    只是一个想法......

    【讨论】:

    • 感谢您阐明 FFLUSH 的工作原理,我在搜索中没有看到最后一句话。
    • 嗨@Ollie,我仍然对 FFLUSH 的工作原理感到困惑,因为(1-->32767 +n),每次我放,我都会冲洗。为什么还需要新的生产线?你能帮忙解释一下吗?
    【解决方案2】:

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

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

    【讨论】:

    • 我对 java 存储过程很感兴趣。虽然我相信 Java 代码本身会很简单,但我们店里不做任何 Java 编码,所以这将是一个维护问题,必须有人去拿。
    • 您能帮忙解释一下我们如何使用 BFILE 对象解决这个问题吗?
    • @Jaskey,实际上我认为我对此不正确。我相信 BFILE 是只读的,因此不能用于将数据写入 OS 文件。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多