Как выполнить сброс вывода из PL/SQL в Oracle?
Я пишу SQL-скрипт, который вызывается из оболочки и выполняется довольно долго. В данный момент в скрипте присутствуют команды dbms_output.put_line
в разных местах. Вывод этих команд отображается в лог-файлах, но только после завершения выполнения скрипта.
Существует ли способ добиться вывода в лог-файл в процессе выполнения скрипта, а не только по его завершении?
3 ответ(ов)
Не совсем. Механизм работы DBMS_OUTPUT следующий: ваш PL/SQL блок выполняется на сервере базы данных без взаимодействия с клиентом. Когда вы вызываете PUT_LINE, он просто помещает этот текст в буфер в памяти на сервере. Когда ваш PL/SQL блок завершает выполнение, управление передается обратно клиенту (в данном случае я предполагаю использование SQLPlus); в этот момент клиент извлекает текст из буфера, вызывая GET_LINE, и отображает его.
Таким образом, единственный способ сделать вывод в лог-файл более частым — это разбить большой PL/SQL блок на несколько меньших, чтобы управление возвращалось к клиенту чаще. Однако это может быть нецелесообразно в зависимости от того, что делает ваш код.
Другие альтернативы включают использование UTL_FILE для записи в текстовый файл, который можно сбрасывать в любое время, или использование процедуры с автономной транзакцией для вставки отладочных сообщений в таблицу базы данных с фиксацией после каждого сообщения.
Два варианта:
Вы можете вставлять данные для логирования в таблицу логирования, используя автономную транзакцию. Это позволит вам запросить эту таблицу логирования в другой сессии SQLPLUS/Toad/sql developer и т.д. Вам необходимо использовать автономную транзакцию, чтобы зафиксировать ваши данные логирования, не нарушая обработку транзакций в вашем основном SQL скрипте.
Другой вариант — использовать конвейерную функцию, которая возвращает вашу информацию для логирования. Пример можно найти здесь: http://berxblog.blogspot.com/2009/01/pipelined-function-vs-dbmsoutput.html. При использовании конвейерной функции вам не нужно открывать другую сессию SQLPLUS/Toad/sql developer и т.д.
Для установки метаданных сессии MODULE
и/или ACTION
с использованием dbms_application_info()
в Oracle, вы можете использовать следующий подход:
BEGIN
-- Устанавливаем MODULE
dbms_application_info.set_module('ArchiveData', 'Описание модуля');
-- Устанавливаем ACTION
dbms_application_info.set_action('xxx of xxxx');
END;
/
Эти вызовы позволяют задать контекст выполнения для текущей сессии, что впоследствии можно отслеживать с помощью Oracle Enterprise Manager (OEM). После выполнения данного кода, в интерфейсе OEM вы сможете увидеть указанные вами значения в разделе мониторинга сессий:
Module: ArchiveData
Action: xxx of xxxx
Для получения более полной информации о настройке и использовании данных функций, вы можете обратиться к документации Oracle.
Получить строки с максимальным значением в одном столбце для каждого уникального значения другого столбца
Тип данных Oracle Timestamp
Как посчитать количество вхождений символа в значении varchar Oracle?
Как сравнить строки в SQL, игнорируя регистр?
Как использовать константу пакета в SQL-запросе SELECT?