Oracle 18c-PL/SQL限制写入文件的记录
我有一个过程,它创建一个文件,其中包含尽可能多的从游标返回的记录。由于下游文件大小问题,我想将每个文件限制为~500k(n)个记录(从参数表中导出的值)。如果光标中的记录超过500k(n),则应创建具有较新时间戳的新文件。该过程使用以下步骤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
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
吗?因为你没有(大概)如果表中没有记录,则要写入空文件。