设置TERMOUT OFF无效时,如何在不达到缓冲区限制的情况下SPOOL输出

时间:2018-10-05 14:19:19

标签: oracle oracle-sqldeveloper

我正在使用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不起作用

1 个答案:

答案 0 :(得分:2)

From the SQL*Plus documentation,这在很大程度上也适用于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,它没有这种限制。