Если процедура, которую вы запускаете, занимает много времени, DBMS_OUTPUT.PUT_LINE
мало поможет.Ну, это будет что-то отображать, но - поскольку вы используете цикл, в зависимости от количества итераций, DBMS_OUTPUT
может исчерпать размер буфера или превысить количество видимых строк в SQL * Plus (если вы используетеэто) и вы потеряете часть вывода.
Кроме того, вы не увидите ни одной буквы из DBMS_OUTPUT.PUT_LINE
, пока процедура не завершится.
Поэтому я бы предложил вам использовать другой подход - простое ведение журнала, которое требует таблицы, последовательности и процедуры (автономной транзакции).Вот скрипт:
CREATE TABLE a1_log
(
id NUMBER,
datum DATE,
descr VARCHAR2 (500)
);
CREATE SEQUENCE seqlognap START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE PROCEDURE a1_p_log (par_descr IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO a1_log
SELECT seqlognap.NEXTVAL, SYSDATE, par_descr FROM DUAL;
COMMIT;
END a1_p_log;
Затем поместите вызовы A1_P_LOG в вашу собственную процедуру;что-то вроде
begin
a1_p_log('selecting from a large table');
select ... into ... from ...;
a1_p_log('entering the loop');
while ... loop
a1_p_log('doing something');
end loop;
a1_p_log('the end');
end;
Вот где имеет значение автономная транзакция - она будет фиксировать вставки в таблицу журнала (не затрагивая основную транзакцию), так что вы можете (конечно, в другом сеансе) отслеживать выполнение,просто многократно набрав
SELECT *
FROM a1_log
ORDER BY id;
Это покажет (воображаемый пример):
1 22.05.2018 18:13:00 selecting from a large table
2 22.05.2018 18:20:07 entering the loop
3 22.05.2018 18:20:07 doing something
4 22.05.2018 18:20:08 doing something
5 22.05.2018 18:20:09 doing something
6 22.05.2018 18:20:10 the end
, и вы увидите, что выполнение шага 1 занимает 7 минут, так что - это то, что вынужно расследовать.Это означает, что вам не нужно ждать завершения основной процедуры - отмените ее и начните работать над узким местом.Как только вы это исправите, запустите все снова.