3

我有 PL/SQL 块,它从表函数查询,我使用游标逐记录处理它,有一些业务逻辑,最后将合格记录写入文件。

要处理的记录数高达 100 万条。总处理速度约为每分钟10000条记录。(经过少量数据测试)

现在,我需要在不同的环境 JSP 中指示处理状态。

DECLARE
 vSFile   utl_file.file_type;
 vNewLine VARCHAR2(200);
 my_cursor IS SELECT * FROM MYTABLE;
 my_details my_cursor%rowtype;
BEGIN
  vSFile := utl_file.fopen('ORALOAD', file_name,'r');

  IF utl_file.is_open(vSFile) THEN
        utl_file.get_line(vSFile, vNewLine);


        OPEN my_cursor;
        LOOP
               FETCH my_cursor INTO my_details;
               EXIT WHEN sll_cur%NOTFOUND;
               -- Do processing
               utl_file.putf(logfile,'%s ',my_details);
               -- A info tht record completed!
        END LOOP;
        CLOSE logfile;
        CLOSE my_cursor;
  END IF;
EXCEPTION
WHEN OTHERS THEN
    --Error handling
END;
/

此处写入的日志信息,在该过程完成之前不可用。所以,我无法追踪它完成了多远。有人可以帮助我吗?

4

1 回答 1

4

要将数据写入文件,您应该使用 FFLUSH 过程。例如:

OPEN my_cursor;
   LOOP
      FETCH my_cursor INTO my_details;
      EXIT WHEN sll_cur%NOTFOUND;
      -- Do processing
      utl_file.putf(logfile,'%s ',my_details);
      -- Call the FFLUSH proc here..And contents are available immediately.
      utl_file.FFLUSH(logfile); 
END LOOP;

从文档中:

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

当文件必须在仍处于打开状态时读取时,刷新很有用。例如,可以将调试消息刷新到文件中,以便立即读取它们。

Oracle 文档UTL_FILE中有更多信息。

于 2014-01-30T11:53:39.340 回答