【问题标题】:How to increase dbms_output buffer?如何增加 dbms_output 缓冲区?
【发布时间】:2013-05-04 19:15:05
【问题描述】:

我尝试通过dbms_output 调试我的动态查询,但似乎查询字符串对于dbms_output 缓冲区来说太长了。

我明白了:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_OUTPUT", line 148
ORA-06512: at line 1 

知道如何增加缓冲区大小吗?

【问题讨论】:

  • 您可能正在使用 dbms_output 写入太多信息。它不是为此而设计的。您最好的选择可能是将这些消息插入到表格中,然后从表格中选择
  • @a_horse_with_no_name:我从不赞成使用数据库表作为应用程序日志,因为可能会发生无法记录的事件:例如,如果应用程序无法连接到数据库,您在哪里记录以下事实如果日志在您无法连接的数据库中,应用程序无法连接?我更喜欢将日志写入平面文件(使用 PL/SQL 中的 UTL_FILE 包),与数据库中的表相比,IMO 不太可能不可用。 YMMV。分享和享受。
  • @BobJarvis:在 PL/SQL 过程中,我认为这很有意义。对于常规应用程序代码(Java、C#、...),我同意你的看法。

标签: sql oracle plsql oracle10g dbms-output


【解决方案1】:

您可以启用 DBMS_OUTPUT 并设置缓冲区大小。缓冲区大小可以在 1 到 1,000,000 之间。

dbms_output.enable(buffer_size IN INTEGER DEFAULT 20000);
exec dbms_output.enable(1000000);

检查this

编辑

根据 Frank 和 Mat 发表的评论,您也可以使用 Null 启用它

exec dbms_output.enable(NULL);

buffer_size :上限,以字节为单位,缓冲信息量。将 buffer_size 设置为 NULL 表示不应有限制。最大大小为1,000,000,当用户指定buffer_size (NOT NULL)时最小为2,000。

【讨论】:

  • 尝试禁用 dbms_output,然后以最大大小启用它
  • 也可以调用dbms_output.enable(NULL),将缓冲区大小设置为无限,见docs.oracle.com/cd/B19306_01/appdev.102/b14258/…
  • @a_horse_with_no_name:我认为这在 10g 中发生了变化。 " 默认缓冲区大小为 20000 字节。最小大小为 2000 字节,最大无限制。" docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_output.htm
  • @a_horse_with_no_name 刚刚尝试过 (10.2.0.4) - 将其设置为 NULL 允许我打印超过 1,000,000: set serveroutput on declare i pls_integer; buf varchar2(1000) 默认 lpad('a', 1000, 'a');开始 dbms_output.enable(null); -- 省略参数会导致缓冲区溢出 begin for i in 1 .. 1001 loop dbms_output.put_line(i); dbms_output.put_line(buf);结束循环;其他人则异常 dbms_output.put_line(SQLERRM);结尾;结束;
  • 这仅适用于当前事务吗?换句话说:我们需要设置旧值吗?
【解决方案2】:

当缓冲区大小变满时。您可以尝试多种选择:

1) 将 DBMS_OUTPUT 缓冲区的大小增加到 1,000,000

2) 尝试过滤写入缓冲区的数据 - 可能存在写入 DBMS_OUTPUT 的循环,而您不需要此数据。

3) 在代码中的各个检查点调用 ENABLE。每次调用都会清除缓冲区。

DBMS_OUTPUT.ENABLE(NULL) 将默认为 20000 以实现向后兼容性Oracle documentation on dbms_output

您还可以创建自定义输出显示。如下所示的 sn-ps

create or replace procedure cust_output(input_string in varchar2 )
is 

   out_string_in long default in_string; 
   string_lenth number; 
   loop_count number default 0; 

begin 

   str_len := length(out_string_in);

   while loop_count < str_len
   loop 
      dbms_output.put_line( substr( out_string_in, loop_count +1, 255 ) ); 
      loop_count := loop_count +255; 
   end loop; 
end;

链接-Ref :Alternative to dbms_output.putline @作者:亚历山大

【讨论】:

  • DBMS_OUTPUT.ENABLE(NULL) 与省略参数不同。 Oracle 文档(见链接)明确指出:“buffer_size 上限,以字节为单位,缓冲的信息量。将 buffer_size 设置为 NULL 表示应该没有限制。”
  • 我认为您需要更改程序:create or replace procedure FRE_OUTPUT_REPLACE(input_string in varchar2 ) is out_string_in long default input_string; string_lenth number; loop_count number default 0; begin string_lenth := length(out_string_in); while loop_count &lt; string_lenth loop dbms_output.put_line( substr( out_string_in, loop_count +1, 255 ) ); loop_count := loop_count +255; end loop; end FRE_OUTPUT_REPLACE;
【解决方案3】:

给你:

DECLARE
BEGIN
  dbms_output.enable(NULL); -- Disables the limit of DBMS
  -- Your print here !
END;

【讨论】:

  • 是的,但是他必须用NULL来调用它,因为它在文档中这样写。 buffer_size 缓冲信息量的上限,以字节为单位。将 buffer_size 设置为 NULL 表示应该没有限制。
  • 但是真的会有20000的限制吗?
  • 不。我刚刚打印了一百行 1000 字符,每个字符总共 100000。通过PL/SQL Developer。调整dbms_output.enable(100) 会引发缓冲区溢出错误;)
  • 那么“DBMS_OUTPUT.ENABLE(NULL) 将默认为 20000 以实现向后兼容性”是什么意思?
  • 如果您在旧版本的 oracle 上运行考虑新文档编写的代码,该版本在 DBMS 中有该限制;)
猜你喜欢
  • 2016-07-20
  • 2011-12-24
  • 2021-08-17
  • 2014-12-20
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多