Я бы не рекомендовал пытаться записать 50M файлов на диск, но вот код, с которым вы можете поиграть, чтобы продемонстрировать, почему это не очень хорошая идея
1: функция, которая записывает файлы на диск, используя каталог
create or replace function WRITETOFILE (dir in VARCHAR2,fn in VARCHAR2, dd IN clob) return clob AS
ff UTL_FILE.FILE_TYPE;
l_amt number := 30000;
l_offset number := 1;
l_length number := nvl(dbms_lob.getlength(dd),0);
buf varchar2(30000);
begin
ff := UTL_FILE.FOPEN(dir,fn,'W',32760);
while ( l_offset < l_length ) loop
buf := dbms_lob.substr(dd,l_amt,l_offset);
utl_file.put(ff, buf);
utl_file.fflush(ff);
utl_file.new_line(ff);
l_offset := l_offset+length(buf);
end loop;
UTL_FILE.FCLOSE(ff);
return dd;
END WRITETOFILE;
/
2: оператор, создающий таблицу со всеми строками из запроса, использующего приведенную выше функцию, - предлагая сохранить небольшое количество строк, чтобы увидеть, как он воспроизводится
create table tmptbl as
select writetofile('DMP_DIR','xyz-'||level||'.xml', xmlelement("x", level).getClobVal()) tmpcol, systimestamp added_at
from dual CONNECT BY LEVEL <= 10;
3: удалить таблицу, чтобы повторить оператор создания таблицы с большим количеством строк
drop table tmptbl purge;
Я сделал 10 тыс. Файлов за 10 секунд - что дало бы 1000 секунд для 1М файлов и 50000 секунд для 50М файлов (то есть чуть менее 14 часов).