Телефон и кабельные компании поддерживают модель их топологии проводного соединения, которая в действительности является большой сетью или графиком. Рекурсия является одним способом пересечь эту модель, когда Вы хотите найти всего родителя или все дочерние элементы.
, Так как рекурсия является дорогой от обработки и перспективы памяти, этот шаг обычно только выполняется, когда топология изменяется, и результат хранится в измененном предварительно заказанном формате списка.
У вас может быть процедура, которая записывает сообщения в таблицу с использованием автономной транзакции, например:
procedure log (p_message)
is
pragma autonomous_transaction;
begin
insert into message_log (user, datetime, message)
values (user, sysdate, p_message);
commit;
end;
Затем отслеживайте таблицу из другого сеанса Oracle.
Обычно есть два варианта:
Если у вас нет доступа ОС к хосту базы данных, вы все равно можете писать в файловую систему dbhost и связывать внешне определенную таблицу Oracle в файл, чтобы его можно было запросить с помощью SELECT.
Это может зависеть от вашего клиентского инструмента. Я давно не использовал SQL * Plus, но когда я отлаживаю процедуры в PL / SQL Developer, я открываю командное окно и запускаю команду SET SERVEROUTPUT ON
. Затем, когда я выполняю процедуру, все, что напечатано DBMS_OUTPUT.PUT_LINE
, сразу появляется.
Редактировать: вы правы, я думаю, я видел это только с большим объемом вывода или что-то в этом роде. Как бы то ни было, я поискал в Интернете и наткнулся на log4plsql - может быть полезно.
В качестве альтернативы можно использовать конвейерную функцию, которая возвращает информацию о журналах. См. Пример здесь: http://berxblog.blogspot.com/2009/01/pipelined-function-vs-dbmsoutput.html Когда вы используете конвейерную функцию, вам не нужно использовать другой SQLPLUS / Toad / sql developer и т. Д. Сеанс.
Вы можете использовать DBMS Pipe и Pipe Viewer в PL / SQL Developer, чтобы асинхронно перехватывать всю информацию, когда она помещается в конвейер.
Будьте осторожны, помещайте вещи в конвейер только тогда, когда есть кто-то, кто их прочитает. В противном случае ваш вызов не удастся, когда канал заполнен.
Также существует возможность использования событий, PL / SQL Developer также имеет монитор событий. И в документации должен быть приведен пример того, как это сделать.
у нас есть небольшая хитрость для этого.
вы можете использовать DBMS_APPLICATION_INFO.set_client_info («некоторая информация здесь»); создать несколько переменных и заменить строку внутри "".
и использовать select client_info из v $ session для отслеживания прогресса.
Я использовал для этой цели dbms_pipe. Отправлять сообщения в именованный канал и читать их из другого сеанса. Этот метод может не работать в среде RAC, когда процессы записи и чтения могут подключаться к другому узлу.
В качестве альтернативы вы можете вставлять сообщения в таблицу, используя процедуру, которая выполняется в ее собственном сеансе с использованием «pragma autonomous_transaction». Вы можете запросить эти сообщения из другого сеанса
Изменить: я вижу, что мой второй вариант уже упоминался.
Другой вариант - пусть ваш PL / SQL вызовет процедуру для отправки электронного письма с записью в нем. Для этого требуется, чтобы ваша база данных имела возможность отправки электронной почты, которую можно добавить с помощью UTL_SMTP.