Oracle 18c-PL/SQL限制写入文件的记录

Oracle 18c-PL/SQL限制写入文件的记录,sql,oracle,plsql,utl-file,oracle18c,Sql,Oracle,Plsql,Utl File,Oracle18c,我有一个过程,它创建一个文件,其中包含尽可能多的从游标返回的记录。由于下游文件大小问题,我想将每个文件限制为~500k(n)个记录(从参数表中导出的值)。如果光标中的记录超过500k(n),则应创建具有较新时间戳的新文件。该过程使用以下步骤 set v_date = to_char(SYSDATE, 'YYYYMMDDHH24MISS'); set new_file_name = 'new_file_'|| v_date open record cursor loop fetch

我有一个过程,它创建一个文件,其中包含尽可能多的从游标返回的记录。由于下游文件大小问题,我想将每个文件限制为~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

在否决投票之前,如果您需要更多信息,请留下评论。我正在寻找最简单和最有效的解决方案。

您需要三个循环。外部循环管理每个文件,中间循环获取记录,内部循环写入记录。因此,调整您的伪代码

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;

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

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;

您可以在循环中使用随每次迭代而增加的计数变量if-else,如果它超出限制,则在if-else块中创建新文件并重置计数变量您可以在循环中使用随每次迭代而增加的计数变量if-else,如果它超出限制,在if-else块中创建新文件并重置计数变量我可以问你为什么有两次
fetch bulk collect
吗?因为如果表中没有记录,你(大概)不想写一个空文件。我可以问你为什么有两次
fetch bulk collect
吗?因为你没有(大概)如果表中没有记录,则要写入空文件。