使用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;
worksofar NUMBER := 0;
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';