代码之家  ›  专栏  ›  技术社区  ›  TomB

当设置TERMOUT OFF不起作用时,如何在不达到缓冲区限制的情况下假脱机输出

  •  1
  • TomB  · 技术社区  · 6 年前

    我正在使用sqldeveloper并尝试输出相当数量的数据。当超过缓冲区溢出时,脚本中途停止。

    我理解这是因为脚本输出无法处理如此多的数据,但解决方法是 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 回复  |  直到 6 年前
        1
  •  2
  •   Alex Poole    6 年前

    From the SQL*Plus documentation ,这在很大程度上也适用于SQL开发人员:

    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
    ...
    

    set serveroutput on size unlimited
    

    但正如您所看到的,在SQLDeveloper中,直到18.2版本,仍然会将您的容量限制为1000000字节。

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

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