首页 > 解决方案 > 设置 TERMOUT OFF 时如何在不达到缓冲区限制的情况下 SPOOL 输出不起作用

问题描述

我正在使用 SQL 开发人员并尝试提取大量数据。当超出缓冲区溢出时,脚本中途停止。

我知道这是因为脚本输出无法处理这么多数据,但解决方案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 不起作用

标签: oracleoracle-sqldeveloper

解决方案


来自 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,它不会施加这种限制。


推荐阅读