评论中提到的场景的简单演示:
create or replace procedure p42(out_message out varchar2) as
begin
out_message := 'Test message';
end p42;
/
如果我用一个声明得足够大的变量来调用它,那就没问题了。我有一个 12 个字符的变量,因此分配 12 个字符的值不是问题:
declare
msg varchar2(12);
begin
p42(msg);
end;
/
anonymous block completed
但是,如果我犯了一个错误并使调用者的变量太小,我会收到您所看到的错误:
declare
msg varchar2(10);
begin
p42(msg);
end;
/
Error report:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "STACKOVERFLOW.P42", line 3
ORA-06512: at line 4
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause:
*Action:
错误堆栈显示过程中出错的行(第 3 行)以及调用方中触发错误的行(第 4 行)。当然,根据您调用它的位置,您可能没有整个堆栈。
您提到将来会出现各种错误消息。您需要确保任何调用此函数的变量定义的变量都足够大以处理您的任何消息。如果它们存储在表中,您可以半自动化,否则这将是手动代码审查检查。
好的,在发布此内容后看到了您的 c# 评论。看起来你正在打电话这个构造函数;这并没有说明它的默认大小是多少,但认为它可能是 1 并不是没有道理的。所以你需要调用这个构造函数相反,明确指定大小:
OracleParameter(字符串, OracleType, Int32)
初始化使用参数名称的 OracleParameter 类的新实例,
数据类型和长度。
... 就像是:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
除非有一种方法可以在创建后重置大小,但我看不到。 (我从来没有使用过!)。