【问题标题】:Oracle 18c - PL/SQL limiting records written to fileOracle 18c - PL/SQL 限制写入文件的记录
【发布时间】:2019-12-18 21:13:21
【问题描述】:

我有一个过程可以创建一个文件,其中包含从游标返回的尽可能多的记录。由于下游文件大小问题,我想将每个文件限制为 ~500k(n) 条记录(从参数表中得出的值)。如果游标中有超过 500k(n) 条记录,则应创建一个具有较新时间戳的新文件。该过程使用以下步骤。

set v_date = to_char(SYSDATE, 'YYYYMMDDHH24MISS');
set new_file_name = 'new_file_'|| v_date
  open record cursor
  loop
    fetch bulk collect with 1000 record limit
    for loop
      write records to file
    end loop
    clear cache
  close cursor loop

在投反对票之前,如果您需要更多信息,请发表评论。我正在寻找最简单的解决方案以及最有效的解决方案。

【问题讨论】:

  • 您可以在循环中使用 if else 和 count 变量,该变量会随着每次迭代而增加,如果超出限制,则在 if else 块中创建新文件并重置 count 变量

标签: sql oracle plsql utl-file oracle18c


【解决方案1】:

你需要三个循环。外循环管理每个文件,中间循环获取记录,内循环写入记录。所以,调整你的伪代码......

open record cursor    
loop

    fetch bulk collect with 1000 record limit
    exit when 0

    record_count := 0;
    utl_file.fopen(dir, 'new_file_'||to_char(SYSDATE, 'YYYYMMDDHH24MISS'), 'W');

    loop

        for loop
             write records to file
        end loop

        record_count := record_count + 1000;
        if record_count = 50000 then exit;

        fetch bulk collect with 1000 record limit
        exit when 0

    end loop

    close file

end loop;
close record cursor;

【讨论】:

  • 请问为什么你有两次fetch bulk collect
  • 因为如果表中没有记录,你(大概)不想写一个空文件。
猜你喜欢
  • 2015-07-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多