Используйте select внутри свойства 'filename' файла utl_file.fopen - PullRequest
1 голос
/ 06 августа 2020

У меня есть процедура, которая извлекает данные из представления и сохраняет их на диске c в формате CSV. Я хочу, чтобы имя файла содержало самую последнюю отметку времени из таблицы MY_TIMESTAMPS. Пока это выглядит так:

create or replace procedure write_file is
    file_handle UTL_FILE.file_type;
begin
    file_handle := utl_file.fopen('CSV_DIR', 'EXPORT_ABC_'|| (select to_char(max(EVENT_TS)) from MY_TIMESTAMPS) ||'.csv', 'w', 32767);
    for x in (select * from V_MY_VIEW
    loop utl_file.put_line (file_handle, COL1|| ',' ||
                                        COL2|| ',' ||
                                        COL3|| ',' ||
                                        COL4);
    end loop;
    utl_file.fclose(file_handle);
end write_file;

Часть с (select to_char(max(EVENT_TS)) from MY_TIMESTAMPS) выдает ошибку. Как я могу установить это свойство Dynami c filename? Может быть, записать это в какую-нибудь переменную в начале процедуры? Я пытался использовать DEFINE, но это тоже ошибка.

1 Ответ

2 голосов
/ 06 августа 2020

Да, вы просто можете объявить переменную для использования в своем операторе select с добавленным предложением INTO, например

CREATE OR REPLACE PROCDURE write_file IS
  file_handle utl_file.file_type;
  v_event_ts  varchar2(100);
BEGIN
  SELECT to_char(max(EVENT_TS)) INTO v_event_ts FROM my_timestamps;
  file_handle := utl_file.fopen('CSV_DIR', 'EXPORT_ABC_'||v_event_ts||'.csv', 'w', 32767);
    ......

, где обработка исключений не требуется для этого SELECT выписка.

...