Генерация XML-файлов из запроса Oracle - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть запрос, который возвращает 50 миллионов строк. Я хочу генерировать XML-файлы для каждой строки (максимальный размер файла составляет 100 КБ). Конечно, я знаю теги, но я не знаю, как написать это наиболее эффективным способом. Любая помощь?

Спасибо

1 Ответ

0 голосов
/ 04 ноября 2019

Я бы не рекомендовал пытаться записать 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 часов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...