5

我在 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...
4

1 回答 1

10

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

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(String, OracleType, Int32)
使用参数名称、数据类型和长度初始化 OracleParameter 类的新实例。

... 就像是:

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

除非有办法在创建后重置大小,我看不到。(不是我用过的东西!)。

于 2013-07-11T18:09:15.617 回答