oracle - 设置 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 不起作用
解决方案
来自 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,它不会施加这种限制。
推荐阅读
- amazon-web-services - 使用 Boto3 时出现权限错误,但通过 aws cli 工作
- c++ - C ++正则表达式一一替换
- javascript - 用于检查一个文件的简单 JS linter,没有项目?
- java - 在 Java 中使用 mvel/ListCreator 导出报表
- git - Git 使用通配符签出特定版本
- python-3.x - TensorFlow map_fn 内存不足问题
- symfony - Symfony 3.4 和 Swiftmailer - 是否可以立即/不使用假脱机发送电子邮件?
- python - 如何在装饰器中使用与 Python 函数中相同的参数?
- java - 如何在 Spring 中使用 CompletableFuture 链接异步调用和传播异常
- python - 运行 tensorflow 时出现间歇性错误“GPU 同步失败”错误