Oracle PL / SQL - Советы для немедленного вывода / консоли печати

StackOverflow https://stackoverflow.com/questions/1729739

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

У нас есть небольшой трюк для этого.

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

и используйте Select Client_Info из V $ Session, чтобы контролировать прогресс.

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

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

РЕДАКТИРОВАТЬ: Я вижу, что мой второй вариант уже был упомянут.

Как правило, есть два варианта:

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

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

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

РЕДАКТИРОВАТЬ: Вы правы, я думаю, я видел это только с большим количеством выводов или что -то в этом роде. Во всяком случае, я сделал поиск в Интернете и наткнулся на это log4plsql - может быть полезен.

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

Вы можете использовать DBMS Tipe и просмотрщик труб в разработчике PL/SQL, чтобы асинхронно поймать все Infos, поскольку они помещают в трубу.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top