我面临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的大小。
答案 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,至少?为了允许将来进行更改,您可能应该将其设置为更大,这样您就不必返回并修改呼叫者。