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_line
。 put
过程不断填充缓冲区并且不刷新它,即使字符串参数包含换行符。
比较这两种写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 缓冲区大小(客户端或数据库端)的主要内容,如果未能解决你的问题,请参考以下文章
oracle 10.2.0 如何在plsql 里设置 dbms_output.put_line 打印长度