PL / SQL - получить вывод - PullRequest
       48

PL / SQL - получить вывод

2 голосов
/ 26 апреля 2019

Есть ли способ получать выходные данные из PL / SQL непрерывно, а не ждать, пока SP завершит свое выполнение.Непрерывно означает, что когда он выполняет выполнение немедленно.Любой другой механизм для получения вывода pl / sql?

Согласно документации Oracle

Вывод, который вы создаете с помощью PUT или PUT_LINE, буферизуется в SGA.Вывод не может быть получен до тех пор, пока программный модуль PL / SQL, из которого он был буферизован, не вернется к своему вызывающему.Так, например, Enterprise Manager или SQL * Plus не отображают сообщения DBMS_OUTPUT до завершения программы PL / SQL.

Ответы [ 3 ]

3 голосов
/ 27 апреля 2019

Подход, предложенный Littlefoot, - это то, что я обычно использую.

Однако есть другой подход, который вы можете попробовать для конкретного случая использования.Допустим, у вас есть длительное пакетное задание (например, процесс расчета зарплаты).Вы не хотите быть привязанным перед экраном, отслеживающим прогресс.Но вы хотите знать, как только при обработке любой из строк данных возникает ошибка, чтобы вы могли предпринять действия или сообщить об этом соответствующей команде.В этом случае вы можете добавить код для отправки электронных писем со всей информацией из базы данных, как только обработка строки обнаружит ошибку (или удовлетворяет заданному вами условию).

Это можно сделать с помощьюфункции и процедуры, предоставляемые в пакете 'UTL_MAIL'. UTL_MAIL Документация от Oracle

3 голосов
/ 27 апреля 2019

Для мониторинга хода выполнения без дополнительных затрат на запись в таблицы и автономные транзакции.Я использую:

DBMS_APPLICATION.SET_CLIENT_INFO( TO_CHAR(SYSDATE, 'HH24:MI:SS') || ' On step A' );

, а затем монитор в v$session.client_info для вашей сессии.Это все в памяти и, конечно, не будет сохраняться, но это быстрый и простой способ публикации прогресса о нулевой стоимости.

Другой вариант (Linux / UNIX) для централизованного ведения журнала, который является постоянным и снова избегает входа в систему.база данных, которую мне больше всего нравится просматривать, взаимодействует с syslog, и Splunk или что-то подобное подбирает их.Если у вас есть Splunk или аналогичный, то это делает мониторинг видимым без необходимости прямого подключения к запросу к базе данных.Смотрите этот пост здесь, чтобы узнать, как это сделать.

https://community.oracle.com/thread/2343125

3 голосов
/ 26 апреля 2019

Насколько я знаю, есть способ, но не с DBMS_OUTPUT.PUT_LINE. Техника Я использую это:

  • создать таблицу log , которая будет принимать значения, которые вы обычно отображаете, используя DBMS_OUTPUT.PUT_LINE. Я использую столбцы
    • ID (последовательность, чтобы иметь возможность сортировать данные)
    • Дата (чтобы знать, что произошло, когда; возможно, этого недостаточно для сортировки, поскольку операции, выполнение которых занимает очень короткое время, могут иметь одну и ту же метку времени)
    • Сообщение (столбец VARCHAR2, достаточно большой, чтобы принять всю информацию)
  • создать процедуру регистрации, которая будет вставлять значения в эту таблицу. Это должна быть автономная транзакция, чтобы вы могли COMMIT внутри (и иметь доступ к данным из других сеансов), не затрагивая основную транзакцию

Сделав это, вы

  • начать процедуру PL / SQL
  • вызывать процедуру регистрации всякий раз, когда это необходимо (в основном, куда вы бы положили DBMS_OUTPUT.PUT_LINE вызов)
  • в другом сеансе периодически запрашивать таблицу журнала как select * from log_table order by ID desc

Кроме того, вы можете написать простое приложение Apex с одной страницей отчета, которое выбирает из таблицы журналов и периодически обновляет (например, каждые 10 секунд или около того) и просматривает выполнение основной процедуры PL / SQL.

...