Oracle / SQL PLUS: как катушить журнал и писать с перерывами по всему сценарию


Выяснить, как катушка к файлу была достаточно проста. Я надеюсь, что есть возможность записывать в текстовый файл после каждой команды. Я не знаю, как сообщить статус длинного сценария другим людям в моей команде. Решение, к которому мы стремились, состояло в том, чтобы записать файл журнала на сетевой диск, поскольку сценарий выполняется, за которым они смогут следить.

Однако это, кажется, только записать выходные данные в файл после команды spool off; в конце файла.

Есть ли какой-либо способ достичь того, что мы пытаемся сделать, либо с помощью буферизации файла журнала, либо другим способом? Вот код, который у меня есть до сих пор.
set timing on;
set echo on;

column date_column new_value today_var
select to_char(current_timestamp, 'yyyymmdd_HH24_MI') as date_column
  from dual
/
select current_timestamp from dual;

SPOOL 'Z:logKPIsecondary_reporting_&today_var..log'

... lots of stuff...
spool off;
2 3

2 ответа:

На ум приходят два метода, в зависимости от того, что является вашим "материалом".

1) Если в вашем коде много SQL-операторов и блоков PL / SQL, то вы можете несколько раз кататься в течение некоторого времени. Используйте для этого оператор spool <filename> append.

SQL> help spool

 SPOOL
 -----

 Stores query results in a file, or optionally sends the file to a printer.
 In iSQL*Plus, use the Preferences screen to direct output to a file.

 SPO[OL] [file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]] | OFF | OUT]

 Not available in iSQL*Plus

2) при длительном выполнении процедур PL / SQL используйте пакет UTL_FILE. См. https://docs.oracle.com/html/B14258_02/u_file.htm для получения дополнительной информации. Это требует некоторых привилегий настройки и администрирования в базе данных для настройки каталога там, где разрешено писать.

Насколько я знаю, нет никакого способа контролировать, когда буферный вывод записывается в файл. Один из способов обойти это, однако, может состоять в том, чтобы полностью отказаться от спулинга и просто перенаправить выходные данные:

$ sqlplus @/path/to/script.sql >& /path/to/script.log