0

Как выполнить сброс вывода из PL/SQL в Oracle?

12

Я пишу SQL-скрипт, который вызывается из оболочки и выполняется довольно долго. В данный момент в скрипте присутствуют команды dbms_output.put_line в разных местах. Вывод этих команд отображается в лог-файлах, но только после завершения выполнения скрипта.

Существует ли способ добиться вывода в лог-файл в процессе выполнения скрипта, а не только по его завершении?

3 ответ(ов)

0

Не совсем. Механизм работы DBMS_OUTPUT следующий: ваш PL/SQL блок выполняется на сервере базы данных без взаимодействия с клиентом. Когда вы вызываете PUT_LINE, он просто помещает этот текст в буфер в памяти на сервере. Когда ваш PL/SQL блок завершает выполнение, управление передается обратно клиенту (в данном случае я предполагаю использование SQLPlus); в этот момент клиент извлекает текст из буфера, вызывая GET_LINE, и отображает его.

Таким образом, единственный способ сделать вывод в лог-файл более частым — это разбить большой PL/SQL блок на несколько меньших, чтобы управление возвращалось к клиенту чаще. Однако это может быть нецелесообразно в зависимости от того, что делает ваш код.

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

0

Два варианта:

  1. Вы можете вставлять данные для логирования в таблицу логирования, используя автономную транзакцию. Это позволит вам запросить эту таблицу логирования в другой сессии SQLPLUS/Toad/sql developer и т.д. Вам необходимо использовать автономную транзакцию, чтобы зафиксировать ваши данные логирования, не нарушая обработку транзакций в вашем основном SQL скрипте.

  2. Другой вариант — использовать конвейерную функцию, которая возвращает вашу информацию для логирования. Пример можно найти здесь: http://berxblog.blogspot.com/2009/01/pipelined-function-vs-dbmsoutput.html. При использовании конвейерной функции вам не нужно открывать другую сессию SQLPLUS/Toad/sql developer и т.д.

0

Для установки метаданных сессии 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь