package.procedure 中的 varchar2 给出数字或值错误

问题描述 投票:0回答:1

我有一个程序包。有一个输出变量

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 := '';
,该行将一直有效,直到我尝试向它分配任何内容为止,然后我会再次收到错误。

我尝试使用临时变量并将其分配给它,但出现同样的错误。我尝试过或在网上找到的任何内容似乎都没有帮助。

oracle plsql varchar2
1个回答
0
投票

这不是包的问题,而是变量接受过程的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>
© www.soinside.com 2019 - 2024. All rights reserved.