如何在我的oracle DB中检查DBMS_OUTPUT大小

时间:2014-04-29 15:09:33

标签: oracle dbms-output

我面临Oracle DB中的异常。

java.lang.RuntimeException: java.lang.RuntimeException: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [call SRS_ADMIN.SLI_UTIL.copyData(?,?)]; nested exception is java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: character string buffer too small

我希望命令知道DBMS_OUTPUT的大小。

1 个答案:

答案 0 :(得分:2)

您获得的ORA-06502错误与dbms_output无关。如果你有一个varchar2变量并且你试图将一个太长的值放入其中,你会得到这个。

例如,将11个字符的值放入10个字符的变量中:

declare
  var varchar2(10);
begin
  var := 'abcdefghikl';
end;
/

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4

您需要获得完整的错误堆栈;从SQL * Plus或SQL Developer调用具有相同值的过程将为您提供更多信息,并在发生错误的过程中查明该行。

如果您在dbms_output缓冲区中放入太多内容,则会收到其他错误:

set serveroutput on size 2000
begin
  for i in 1..40 loop
    dbms_output.put('12345678901234567890123456789012345678901234567890');
  end loop;
  dbms_output.put_line('X');
end;
/

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

据我所知,无法查看当前的缓冲区大小; the dbms_output documentation没有显示任何内容,如果它是一个包变量,那么您将无法在没有getter函数的情况下看到它。


如果您从此处获得例外:

inout_error_msg := v_msg || '; errorcode--> ' || v_err;

...然后调用者传递给过程的变量太小了:

declare
  msg varchar2(10);
begin
  copyData(msg);
end;
/

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

增加传递的变量的大小可以解决这个问题:

declare
  msg varchar2(200);
begin
  copyData(msg);
end;
/

anonymous block completed

显然,你必须决定变量的大小;它需要足够大才能做出任何可能的反应。 SQLERRM可以是up to 512 characters,所以你需要允许,加上错误代码和你的固定文本,所以......呃... 536,至少?为了允许将来进行更改,您可能应该将其设置为更大,这样您就不必返回并修改呼叫者。