Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Изменить: я вижу, что мой второй вариант уже упоминался.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Вы можете использовать DBMS Pipe и Pipe Viewer в PL/SQL Developer для асинхронного захвата всей информации, когда они помещаются в трубу.

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

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

Ответ 8

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