Oracle存储过程中的字符串缓冲区错误太小

时间:2013-07-11 16:41:23

标签: sql oracle stored-procedures

我在Oracle 11g存储过程中收到错误。错误是......

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

它发生在第31行,包含out_cnt_tot := 0;的行我真的不确定为什么该行有什么问题。另一个程序员创建了这个过程,我真的不熟悉SQL过程。任何人都可以帮我解决这个问题吗?

create or replace 
PROCEDURE                  "FIP_BANKREC_PREP" 
                   (
    in_file_date in varchar2,
    in_bank_code in varchar2,
    out_cnt_apx_miss_no out integer,
    out_cnt_prx_miss_no out integer,
    out_cnt_apx_no_mtch out integer,
    out_cnt_prx_no_mtch out integer,
    out_cnt_ap_dup out integer,
    out_cnt_pr_dup out integer,
    out_cnt_bad out integer,
    out_cnt_ap_load out integer,
    out_cnt_pr_load out integer,
    out_cnt_ap_not_load out integer,
    out_cnt_pr_not_load out integer,
    out_cnt_tot out integer,
    out_message out varchar2
    ) as

file_date date;
ap_acct_no varchar2(16);
pr_acct_no varchar2(16);

-- ------------------------------------------------------
--  begin logic
-- ------------------------------------------------------
begin

  file_date := to_date(in_file_date,'yyyymmdd');
  out_cnt_tot := 0;   --- THE ERROR IS ON THIS LINE ---
  out_message := 'Test Message';

  select brec_acct_code into ap_acct_no 
    from MSSU.zwkfi_bankrec_accts
    where brec_acct_bank = in_bank_code
      and brec_acct_type = 'AP';

  select brec_acct_code into pr_acct_no 
    from MSSU.zwkfi_bankrec_accts
    where brec_acct_bank = in_bank_code
      and brec_acct_type = 'PR';      

// The rest of the procedure...

1 个答案:

答案 0 :(得分:9)

评论中提到的场景的简单演示:

create or replace procedure p42(out_message out varchar2) as
begin
  out_message := 'Test message';
end p42;
/

如果我用一个声明足够大的变量调用它,那很好。我有一个12-char变量,因此分配12-char值不是问题:

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#评论。看起来你正在呼叫this constructor;它没有说明它的默认大小,但认为它可能是1是不合理的。所以你需要调用this constructor来明确指定大小:

  

OracleParameter(String,OracleType,Int32)
  初始化使用参数名称的OracleParameter类的新实例,   数据类型和长度。

...类似于:

OracleParameter prm15 = new OracleParameter("out_str_message",
    OracleDbType.Varchar2, 80);

除非有一种方法可以在创建后重置大小,我无法看到。 (不是我用过的东西!)。