我有一个程序包。有一个输出变量
p_return_msg VARCHAR2
。
开始之后我有
p_return_msg := 'Validation successful.'
这会导致 ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小 ORA-06512: 在“ZWR5KFR.PRICING_AUDIT_PKG”,第 187 行 ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小 ORA-06512: 在“ZWR5KFR.PRICING_AUDIT_PKG”,第 134 行 ORA-06512: 在第 1 行
第 134 行是该行,第 187 行位于异常部分,我试图再次为其分配一些内容。
p_return_msg := 'Validation failed: '
如果我将该行更改为
p_return_msg := '';
,该行将一直有效,直到我尝试向它分配任何内容为止,然后我会再次收到错误。
我尝试使用临时变量并将其分配给它,但出现同样的错误。我尝试过或在网上找到的任何内容似乎都没有帮助。
这不是包的问题,而是变量接受过程的OUT参数的值。
程序示例:
SQL> create or replace procedure p_test (p_return_msg out varchar2) is
2 begin
3 p_return_msg := 'Validation successful.';
4 end;
5 /
Procedure created.
参见
l_msg
的声明; 5个字符太短了!
SQL> set serveroutput on
SQL> declare
2 l_msg varchar2(5); --> too short!
3 begin
4 p_test(l_msg);
5 dbms_output.put_line(l_msg);
6 end;
7 /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SCOTT.P_TEST", line 3
ORA-06512: at line 4
但是,如果我们放大它,一切都OK:
SQL> declare
2 l_msg varchar2(200); --> long enough
3 begin
4 p_test(l_msg);
5 dbms_output.put_line(l_msg);
6 end;
7 /
Validation successful.
PL/SQL procedure successfully completed.
SQL>