DBMS_OUTPUT 缓冲区大小(客户端或数据库端)

Posted

技术标签:

【中文标题】DBMS_OUTPUT 缓冲区大小(客户端或数据库端)【英文标题】:DBMS_OUTPUT buffer size (client or database side) 【发布时间】:2020-08-09 21:52:28 【问题描述】:

我使用 SQL Developer 在 Oracle 数据库上运行查询,DBMS_OUTPUT 缓冲区大小在 SQL Developer 中默认设置为 (20000)。

当我对 DEV 数据库运行查询时,一切正常。 当我对生产数据库、相同的 SQL Developer 会话运行相同的查询时,我收到错误:

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

你知道为什么吗?数据库端有任何限制。

【问题讨论】:

***.com/questions/16476568/… 可能对你有帮助 缓冲区大小设置为20000,为什么我的查询限制为10000? 声明开始 dbms_output.enable(NULL); - 禁用 DBMS 的限制 - 您的打印在这里!结尾;尝试禁用限制,如果仍然有错误,那么您正在使用的客户端,即 sql 开发人员有冲突。 【参考方案1】:

你没有透露你是如何从dbms_output 包中调用程序的,所以我只能猜测。事实上,我遇到了同样的错误,并在我的案例中找到了一个原因,这当然可能与你的不同。

在我的例子中,我有一个长度为 10000 的缓冲区(在 PLSQL Developer 中,这在这里并不重要),我只调用了 dbms_output.put 过程,而不是 dbms_output.put_lineput 过程不断填充缓冲区并且不刷新它,即使字符串参数包含换行符。

比较这两种写1001行十字符长字符串的尝试(九个可见+行终止符):

begin
  dbms_output.enable(10000);
  for i in 1..1001 loop
    dbms_output.put('123456789' || chr(10)); -- fails here
  end loop;
end;

对比

begin
  dbms_output.enable(10000);
  for i in 1..1001 loop
    dbms_output.put_line('123456789'); -- works
  end loop;
end;

第一个示例以 ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes 失败,因为它试图将 10010 个字符放入缓冲区。

(合成这个简约示例的真实故事是从dba_source 表中打印包源代码。text 列中的每一行源代码都由换行符终止,在发送到@987654330 之前必须修剪该换行符@ - 不修剪会加倍;将文本发送到唯一的put 方法会导致缓冲区问题。)

【讨论】:

以上是关于DBMS_OUTPUT 缓冲区大小(客户端或数据库端)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C 代码访问 dbms_output 缓冲区?

无限缓冲区大小对 dbms.output 的影响

oracle 10.2.0 如何在plsql 里设置 dbms_output.put_line 打印长度

Indy,如何知道所需缓冲区的大小?

增加 video-js HTML5 播放器的缓冲区大小或时间

response对象设置输出缓冲大小