2013-07-11 56 views
5

我在Oracle 11g存储过程中收到错误。该错误是...Oracle存储过程中的字符串缓冲区太小错误

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... 
+0

你怎么知道它是第31行?你确定?您是否尝试用十六进制编辑器查看文件?也许你可以发现一些在编辑器中不可见的UTF-8字符,但会导致问题。 –

+2

看起来更可能是那之后的路线;这些消息中的行号有时并不完全符合您的预期。这意味着它可能是您传递给过程的变量的大小,因为out_message太小,而不是过程本身的错误。你能说明你是如何调用这个的,以及如何为这个调用声明变量? –

+0

传递给out_message的唯一东西是“测试消息”字面值。我们很快会添加消息,但还没有到达它,所以我们只是在那里放置一些占位符文本。字符串“Test Message”对于该变量是否可能太短?我从未听说过这种情况。 – grantmcconnaughey

回答

9

在评论中提到的情况下的简单的演示:

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#评论。看起来你打电话给this constructor;这并不表示它得到什么默认的大小,而不是不合理认为这可能是1,所以,你需要调用this constructor而不是明确指定的大小:

的OracleParameter(字符串,OracleType,Int32)将
初始化一个使用参数名称, 数据类型和长度的OracleParameter类的新实例。

...类似:

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

除非有一种方法创建后的大小重置,这是我看不到。 (不是我曾经用过的!)。

+0

它看起来比如在我的OracleParameter()构造函数中添加12的长度修复了这个问题。非常感谢你的帮助。 – grantmcconnaughey

+0

当然。再次感谢。 – grantmcconnaughey

相关问题