【发布时间】:2020-11-14 20:00:56
【问题描述】:
我知道为了在 sqlplus 上打印一些东西,如下所示:
begin
dbms_output.put_line('Hello!');
end;
/
我需要打电话
set serveroutput on;
在那之前。 我也知道不需要,但我也可以调用
DBMS_OUTPUT.enable;
之前,以防万一。这对我有用。
但是如果我想继续打印一个长循环的进度怎么办?这对我来说似乎是不可能的。我已经尝试了一切以在下面的循环上打印一些进度,但只是不起作用。有没有办法做到这一点?我什至试图假脱机到一个文件,但没有工作。
注意 1:我无法截断或分区此表,因为 DBA 不想帮助我,所以我必须使用这个讨厌的循环...
注意 2:我注意到一旦循环完成,整个输出就会被打印出来。看起来 oracle 正在缓冲输出并在最后打印所有内容。我不确定如何避免这种情况并在每次循环迭代时打印。
set serveroutput on;
declare
e number;
i number;
nCount number;
f number;
begin
DBMS_OUTPUT.enable;
dbms_output.put_line('Hello!');
select count(*) into e from my_big_table where upd_dt < to_date(sysdate-64);
f :=trunc(e/10000)+1;
for i in 1..f
loop
delete from my_big_table where upd_dt < to_date(sysdate-64) and rownum<=10000;
commit;
DBMS_OUTPUT.PUT_LINE('Progress: ' || to_char(i) || ' out of ' || to_char(f));
end loop;
end;
感谢您的任何回答。
【问题讨论】:
-
dbms_output,put_line 将所有输出保存在 dbms_output 包的集合(嵌套表)变量中,因此您无法从另一个会话中获取它,并且客户端在用户调用(执行)期间无法获取它。除了
set serveroutput on,您还可以使用 dbms_output.get_lines 获取输出:orasql.org/2017/12/10/… -
当您的用户调用在数据库中执行时,您无法在同一个会话中从中获取任何内容,因为您的客户端只是在用户调用完成时等待。但我可以建议您使用 Oracle 调度程序:您可以将您的长流程作为一次性作业开始,并使用我的回答中的相同变体在您的会话中对其进行监控
标签: oracle plsql sqlplus dbms-output