如何在设置终止关闭不起作用时在不达到缓冲区限制的情况下进行假脱机输出



我正在使用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 终止

不起作用

来自 SQL*Plus 文档,该文档也适用于 SQL Developer:

终止关闭不会影响以交互方式输入的命令的输出

如果你在脚本文件中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。

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

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

在文件中报告。

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

相关内容

最新更新