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

问题描述 投票:0回答:2

我正在使用 SQL Developer 并尝试假脱机输出大量数据。当超出缓冲区溢出时,脚本中途停止。

我理解这是因为脚本输出无法处理这么大量的数据,但解决方案

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 不起作用

oracle oracle-sqldeveloper
2个回答
2
投票

来自 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 字节。

即使关闭 termout 并假脱机到文件,您仍然会得到

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

已在文件中报告。

如果您需要更多的输出,那么您可以将输出写入临时表,然后在 PL/SQL 块之后查询它。或者您可以使用

utl_file
写入文件(该文件必须位于服务器上,而不是客户端上,这是一个缺点)而不是假脱机。或者您可以使用 SQL*Plus,它不会施加这种限制。


0
投票

现在可以在 SQL Developer 22.2.0.173 中按预期工作:

“脚本结果中当前仅支持 5,000 行,在假脱机文件中继续。 选择了 138,485 行。”

© www.soinside.com 2019 - 2024. All rights reserved.