gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:36:23 26 4
gpt4 key购买 nike

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

最佳答案

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

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(String, OracleType, Int32)
Initializes a new instance of the OracleParameter class that uses the parameter name, data type, and length.



... 就像是:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);

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

关于sql - Oracle存储过程中的字符串缓冲区太小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com