Использование DBMS_OUTPUT
означает, что SQL * Plus не будет отображать ничего, пока не будет завершен весь блок PL / SQL, а затем отобразит все данные, находящиеся в данный момент в буфере. Следовательно, это не подходящий способ предоставления текущего статуса.
С другой стороны, Oracle предоставляет пакет DBMS_APPLICATION_INFO , специально разработанный для того, чтобы помочь вам контролировать ваш работающий код. Например, вы можете сделать что-то вроде
CREATE PROCEDURE process_structures
AS
<<other variable declarations>>
rindex BINARY_INTEGER;
slno BINARY_INTEGER;
totalwork NUMBER := y; -- Total number of structures
worksofar NUMBER := 0; -- Number of structures processed
BEGIN
rindex := dbms_application_info.set_session_longops_nohint;
FOR i IN (<<select structures to process>>)
LOOP
worksofar := worksofar + 1;
dbms_application_info.set_session_longops(
rindex => rindex,
slno => slno,
op_name => 'Processing of Molecular Structures',
sofar => worksofar ,
totalwork => totalwork,
target_desc => 'Some description',
units => 'structures');
<<process your structure with your existing code>>
END LOOP;
END;
Из отдельного сеанса SQL * Plus вы можете отслеживать ход выполнения, запрашивая представление V$SESSION_LONGOPS
SELECT opname,
target_desc,
sofar,
totalwork,
units,
elapsed_seconds,
time_remaining
FROM v$session_longops
WHERE opname = 'Processing of Molecular Structures';