我有一个程序来更新从开始日期到结束日期的余额 我还想跟踪插入的记录数量。我正在使用dbms_output.put_line来获取插入的记录数,但它没有给出任何输出,当执行完成时,则显示计数的输出。程序代码如下:
create or replace function updatebal(start_date IN DATE, end_date IN DATE)
RETURN NUMBER
IS
difference number;
curr_r number;
BEGIN
difference := end_date - start_date;
curr_r := 0;
while curr_r <= difference LOOP
curr_r := curr_r + 10;
for curr_in in 1..10 LOOP
date_value := date_value +1 ;
insertAvailBal(date_value);
commit;
select count(*) into totalCount from avail_bal;
dbms_output.put_line('total count' || totalCount);
end loop;
END LOOP;
RETURN 1;
END;
现在我尝试从此过程中打印totalCount以获取此表中avail_bal中插入的行数。但没有输出。 请帮助我,先谢谢
答案 0 :(得分:2)
Tony已经回答:你无法改变dbms_output的行为。
建议的向存储过程外部发送信号的方法是使用dbms_application_info
包来管理v$session_longops
您甚至可以为外循环和内循环管理单独的进度指示器。 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
答案 1 :(得分:1)
这就是dbms_output的工作方式,它在运行完成后显示其所有输出,您无法实时监控它。
如果您确实需要对进度进行实时监控,可以使用具有自治事务的过程将消息插入特殊表,然后从另一个会话 查看内容当进程仍在运行时,该表的位置。
此类程序的示例:
procedure log_message (p_message varchar2) is
pragma autonomous_transaction;
begin
insert into message_table (message) values (p_message);
commit;
end;