【发布时间】:2013-07-10 01:19:10
【问题描述】:
我在 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...
【问题讨论】:
-
你怎么知道是第 31 行?你确定吗?您是否尝试使用十六进制编辑器查看文件?也许您可以发现一些在您的编辑器中不可见但会导致问题的 UTF-8 字符。
-
它看起来更有可能是在那之后的那一行;这些消息中的行号有时并不完全符合您的预期。这意味着它可能是您作为
out_message传递给过程的变量的大小太小,而不是过程本身的错误。您能说明您是如何调用它的,以及如何为该调用声明变量吗? -
唯一传入 out_message 的是“测试消息”字面量。我们将很快添加消息,但还没有完成,所以我们只是在其中放置了一些占位符文本。对于该变量,字符串“测试消息”是否可能太短?我以前从未听说过这种情况。
-
您将
out_message设置为'Test Message'。没关系。但是out_message变量(错误消息中的“字符串缓冲区”)的大小由调用此过程的任何内容决定。如果它在那里定义为varchar2(10),那么分配将失败,因为该值为 12 个字符。这就是我询问来电者的原因。 -
这是有道理的。 ASP.NET 应用程序中的某些 C# 代码正在调用此过程。 out_str_message OracleParameter 对象没有在我的代码中声明的大小。就是这样:
OracleParameter prm15 = new OracleParameter("out_str_message", OracleDbType.Varchar2);prm15.Direction = ParameterDirection.Output;cmdLoad.Parameters.Add(prm15);
标签: sql oracle stored-procedures