トニーはすでに答えたように:あなたはDBMS_OUTPUTの動作を変更することはできません。
ストアドプロシージャの外部へ進行シグナリングの推奨される方法は、あなたも外側と内側のループに対して別々の進捗インジケータを管理することができるv$session_longops
の情報を管理するdbms_application_info
パッケージを使用することです。 v$session_longops
は、時間の経過とともに平均所要時間に基づいてプロセスがかかる時間の見積もりを表示します。これらの推定値は、各(報告された)ステップの実行時間がかなり一定であればかなり正確です。
あなたはこのようなあなたの機能を高めることができます。
create or replace function updatebal(start_date IN DATE, end_date IN DATE)
RETURN NUMBER
IS
difference number;
curr_r number;
main_index binary_integer;
sub_index binary_integer;
main_slno binary_integer;
sub_slno binary_integer;
BEGIN
difference := end_date - start_date;
curr_r := 0;
-- initialize the module information
dbms_application_info.set_module('updatebal', 'Calculate Balance');
-- initialize two different "handles" for the inner and outer loop
main_index := dbms_application_info.set_session_longops_nohint;
sub_index := dbms_application_info.set_session_longops_nohint;
while curr_r <= difference LOOP
curr_r := curr_r + 10;
-- report each outer step
dbms_application_info.set_session_longops(rindex => main_index,
slno => main_slno,
op_name => 'main loop',
sofar => curr_r,
totalwork => difference);
for curr_in in 1..10 LOOP
date_value := date_value +1;
insertAvailBal(date_value);
commit;
select count(*) into totalCount from avail_bal;
-- report each inner step with the totalcount
dbms_application_info.set_session_longops(
rindex => sub_index,
slno => sub_slno,
op_name => 'Sub Loop, totalcount'||totalcount,
sofar => curr_in, totalwork => 10);
end loop;
END LOOP;
RETURN 1;
dbms_application_info.set_module(null,null);
END;
/
は、より多くの詳細については、マニュアルを参照してください:
https://docs.oracle.com/database/121/ARPLS/d_appinf.htm#ARPLS003