Oracle PL / SQL - советы по немедленному выводу / печати на консоли - PullRequest
20 голосов
/ 13 ноября 2009

У меня есть несколько процедур pl / sql, выполнение которых может занять несколько минут. Разрабатывая их, я добавил несколько инструкций для печати, чтобы помочь отладке, а также предоставил некоторые отзывы и показатели прогресса. Первоначально я запускал их на небольших тестовых наборах и вывод был практически мгновенным. Теперь, когда я тестирую большие тестовые наборы, для запуска которых требуется несколько минут, я обнаружил, что печать на консоль больше не подходит, потому что ничего не печатается до завершения процедуры. Я привык работать в средах, которые не буферизуют свои выходные данные и немедленно распечатывают их, а добавление простых операторов печати для простой отладки и диагностики является обычным явлением.

Возможно ли в pl / sql напечатать вывод сразу (без буферизации)? Если нет, то какие альтернативы люди рекомендуют получить аналогичный результат?

Ответы [ 8 ]

18 голосов
/ 13 ноября 2009

У вас может быть процедура, которая записывает сообщения в таблицу с использованием автономной транзакции, например:

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

Затем следите за таблицей из другого сеанса Oracle.

9 голосов
/ 13 ноября 2009

у нас есть маленький трюк для этого.

вы можете использовать DBMS_APPLICATION_INFO.set_client_info («некоторая информация здесь»); создание некоторых переменных и замена строки внутри "".

и используйте select client_info из v $ session для отслеживания прогресса.

2 голосов
/ 16 ноября 2009

Я использовал dbms_pipe для этой цели. Отправляйте сообщения в именованный канал и читайте их из другого сеанса. Этот метод может не работать в среде RAC, когда процессы записи и чтения могут подключаться к другому узлу.

В качестве альтернативы вы можете вставить сообщения в таблицу, используя процедуру, которая запускается в своем собственном сеансе с использованием "pragma autilitary_transaction". Вы можете запросить эти сообщения из другого сеанса

Редактировать: я вижу, что мой второй вариант уже был упомянут.

1 голос
/ 16 ноября 2009

Вы можете использовать СУБД Pipe и Pipe Viewer в PL / SQL Developer, чтобы асинхронно перехватывать всю информацию по мере ее поступления в канал.

Будьте осторожны, когда кладете вещи в трубу, только когда кто-то читает их. В противном случае ваш вызов не будет выполнен, когда канал заполнен.

Существует также возможность использования событий, PL / SQL Developer также имеет монитор событий. И документы должны предоставить пример того, как это сделать.

1 голос
/ 13 ноября 2009

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

1 голос
/ 13 ноября 2009

Это может зависеть от вашего клиентского инструмента. Некоторое время я не использовал SQL * Plus, но когда я отлаживаю процедуры в PL / SQL Developer, я открываю командное окно и выдаю команду SET SERVEROUTPUT ON. Затем, когда я выполняю процедуру, все, что напечатано DBMS_OUTPUT.PUT_LINE, сразу обнаруживается.

Изменить: вы правы, я думаю, я видел это только с большим количеством продукции или что-то в этом роде. В любом случае, я провел поиск в Интернете и наткнулся на это log4plsql - может быть полезно.

1 голос
/ 13 ноября 2009

Обычно есть два варианта:

  • Отправить вывод в таблицу Oracle (или временная таблица)
  • Запись в файловую систему (хост базы данных) с UTL_FILE

Если у вас нет доступа ОС к хосту базы данных, вы все равно можете выполнить запись в файловую систему dbhost и связать внешнюю таблицу Oracle с файлом, чтобы ее можно было запросить с помощью SELECT.

0 голосов
/ 18 февраля 2010

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

...