gpt4 book ai didi

oracle - 我的长时间 SQL*Plus 循环在执行期间不打印 DBMS_OUTPUT.PUT_LINE 输出

转载 作者:行者123 更新时间:2023-12-02 02:44:07 26 4
gpt4 key购买 nike

我知道为了在 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;

感谢您的回答。

最佳答案

对于此类事情有两种标准方法:

  1. 在 session 中设置模块和操作 DBMS_APPLICATION_INFO.SET_MODULE :

    SQL> exec DBMS_APPLICATION_INFO.SET_MODULE('my_long_process', '1 from 100');

    PL/SQL procedure successfully completed.

    SQL> select action from v$session where module='my_long_process';

    ACTION
    ----------------------------------------------------------------
    1 from 100
  2. 设置 session_longops: DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS

    我会在您的情况下推荐它,因为它是专门为长时间操作而设计的。
    Example on Oracle-Base .

----

PS:dbms_output,put_line将所有输出保存在dbms_output包的集合(嵌套表)变量中,因此您无法从另一个 session 中获取它,并且客户端在用户调用(执行)期间无法获取它。除了 set serveroutput on 之外,您还可以使用 dbms_output.get_lines 获取输出:http://orasql.org/2017/12/10/sqlplus-tips-8-dbms_output-without-serveroutput-on/

顺便说一句,如果您需要过滤或分析 dbms_output 的输出,有时在查询中获取输出很方便,因此您可以在 where 子句中使用过滤字符串或聚合它们: https://gist.github.com/xtender/aa12b537d3884f4ba82eb37db1c93c25

关于oracle - 我的长时间 SQL*Plus 循环在执行期间不打印 DBMS_OUTPUT.PUT_LINE 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63082284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com