Oracle PL / SQL - Советы для немедленного вывода / консоли печати
-
19-09-2019 - |
Вопрос
У меня есть несколько процедур 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.