2013-05-10 91 views
14

我试图通过dbms_output调试我的动态查询,但似乎查询字符串对于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 

任何想法如何增加缓冲区的大小?

+5

您可能正在使用dbms_output编写太多的信息。它不是为此设计的。 – 2013-05-10 07:40:15

+0

@a_horse_with_no_name:我从来不喜欢使用数据库表作为应用程序日志,因为可能出现不可登录的事件:例如,如果应用程序可以' t连接到数据库在哪里记录日志在数据库中无法连接时应用程序无法连接的事实?我更喜欢将日志写入平面文件(使用PL/SQL中的UTL_FILE包),因此IMO不太可能比数据库中的表不可用。因人而异。分享并享受。 – 2013-05-10 12:59:30

+0

@BobJarvis:在PL/SQL过程中,我认为这非常合理。对于常规应用程序代码(Java,C#,...),我确实同意你的看法。 – 2013-05-10 13:06:24

回答

25

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

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

检查this

编辑

按照发布由弗兰克和Mat的评论,你也可以用空

exec dbms_output.enable(NULL); 

BUFFER_SIZE启用它:上限,在中tes,缓冲的信息量。将buffer_size设置为NULL指定应该没有限制。最大大小为1,000,000,当用户指定buffer_size(NOT NULL)时,最小值为2,000。

+0

我收到相同的错误。它没有工作。无论如何,谢谢 – hsuk 2013-05-10 07:10:06

+0

尝试禁用dbms_output,然后以最大大小启用它 – 2013-05-10 07:12:36

+5

您也可以调用dbms_output.enable(NULL),它将缓冲区大小设置为无限制,请参见http://docs.oracle.com/cd/B19306_01 /appdev.102/b14258/d_output.htm#i999293 – 2013-05-10 07:32:50

3

当缓冲区大小变满时。有几个选项,你可以尝试:

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

2)尽量过滤写入缓冲区中的数据 - 可能有一个循环,写入DBMS_OUTPUT和你做不需要这些数据。

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

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

您还可以创建自定义输出display.something像下面网页摘要

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 @通过:亚历山大

+3

DBMS_OUTPUT.ENABLE(NULL)与省略参数不同。 Oracle文档(请参阅链接)明确指出:“buffer_size 缓冲区信息的上限(以字节为单位)。将buffer_size设置为NULL指定不应有限制。 – 2013-05-10 08:44:27

+0

我认为你需要改变这个过程:'创建或替换过程FRE_OUTPUT_REPLACE(input_string in varchar2) 是 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 uzay95 2014-04-05 20:00:05

0

这里你去:

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