oracle 当设置TERMOUT OFF不起作用时,如何在不达到缓冲区限制的情况下进行SPOOL输出

zd287kbt  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(174)

我正在使用SQL开发人员,并试图spool出相当数量的数据。脚本停止通过缓冲区溢出超过一半的方式。
我理解这是因为脚本输出无法处理此数据量,但此SET TERMOUT OFF的解决方案不起作用。
我在下面提供了一个示例来说明此命令不起作用

SET TERMOUT OFF
/

DECLARE

   CURSOR C1 IS

   select distinct '1' NUMBERR from dual;

BEGIN

    for c1_rec in c1 loop

    DBMS_OUTPUT.PUT_LINE(C1_REC.NUMBERR);

   END LOOP;

end;

字符串
输出量:

1

PL/SQL procedure successfully completed.


正如您所看到的,“1”仍然输出到脚本输出,指示SET TERMOUT不工作

bxpogfeg

bxpogfeg1#

从SQL*Plus文档(主要也适用于SQL Developer)中:
TERMOUT OFF不会影响交互输入的命令的输出
如果你在一个脚本文件中有set termout off,然后用@<script>运行它,那么它会抑制输出;但是如果你在假脱机,它仍然会尝试写入相同的数据。
如果你看到的是ORU-10027: buffer overflow,那么你无论如何都在试图解决错误的问题;即使是假脱机,你也会遇到同样的错误--它只会出现在文件中,而不会出现在脚本输出窗口中。
缓冲区与dbms_output本身相关:

set serveroutput on size 2000

begin
  dbms_output.put_line(dbms_random.string('a', 2001));
end;
/

ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
...

字符串
为了避免该错误,请将缓冲区设置为足够高,以满足您期望的输出量,或者设置为Oracle和客户端版本的最大值:

set serveroutput on size unlimited


但正如您所看到的,在SQL Developer中,这仍然限制为1000000字节,无论如何,直到版本18.2。
即使关闭termout并将其假脱机到文件,

ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes


在档案中报告。
如果你需要更多的输出,那么你可以将输出写入一个临时表,然后在PL/SQL块之后查询它。或者你可以使用utl_file写入一个文件(必须在服务器上,而不是客户端,这是一个缺点)而不是假脱机。或者你可以使用SQL*Plus,它没有这种限制。

相关问题