【发布时间】:2020-06-15 10:49:52
【问题描述】:
我正在尝试用 c# 编写一个 ado.net 查询。以下是查询。
DECLARE
i_user_id user_master.login_user_id%TYPE;
i_whse case_hdr.whse%TYPE;
i_sku_id item_master.sku_id%TYPE;
i_actl_qty case_dtl.actl_qty%TYPE;
i_actl_wt case_hdr.actl_wt%TYPE;
i_orig_qty case_dtl.orig_qty%TYPE;
i_shpd_n_qty case_dtl.shpd_asn_qty%TYPE;
o_case_nbr case_hdr.case_nbr%TYPE;
o_error VARCHAR2(2048);
result NUMBER;
BEGIN
i_user_id := 'PSI';
i_whse := '008';
i_sku_id := '2346701';
i_actl_qty := 1;
i_actl_wt := 20;
i_orig_qty := 1;
i_shpd_n_qty := 1;
o_case_nbr := NULL;
o_error := NULL;
result := inventory_engine.lpn_create(i_user_id, i_whse, i_sku_id, i_actl_qty, i_actl_wt, i_orig_qty, i_shpd_n_qty, o_case_nbr, o_error);
END;
我写了这个并尝试了许多其他变体。我做错了什么。
using (OracleConnection con = _dbService.GetOracleConnection())
{
con.Open();
string query2 =
@"DECLARE
result number;
BEGIN
result := inventory_engine.lpn_create(:i_user_id, :i_whse, :i_sku_id, :i_actl_qty, :i_actl_wt, :i_orig_qty, :i_shpd_n_qty, :o_case_nbr, :o_error);
end;";
var cmd = new OracleCommand();
cmd.Connection = con;
var result = new OracleParameter("result", OracleDbType.Decimal, 200, null, ParameterDirection.ReturnValue);
cmd.Parameters.Add(result);
cmd.Parameters.Add(new OracleParameter("i_user_id", OracleDbType.Varchar2, 200, skuDto.UserId, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("i_whse", OracleDbType.Varchar2, 200, skuDto.Warehouse, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("i_sku_id", OracleDbType.Varchar2, 200, skuDto.SkuId, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("i_actl_qty", OracleDbType.Decimal, 200, skuDto.ActualQuantity, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("i_actl_wt", OracleDbType.Decimal, 200, skuDto.ActualWeight, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("i_orig_qty", OracleDbType.Decimal, 200, skuDto.OriginalQuantity, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("i_shpd_n_qty", OracleDbType.Decimal, 200, skuDto.ShippedQuantity, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("o_case_nbr", OracleDbType.Varchar2, 200, null, ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("o_error", OracleDbType.Varchar2, 2048, null, ParameterDirection.Input));
cmd.CommandText = query2;
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
return (string)result.Value;
}
它会抛出以下错误。
Oracle.ManagedDataAccess.Client.OracleException: 'ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "***.INVENTORY_ENGINE", line 316
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
我尝试在数据库中提供匹配的数据类型。现在试图将其增加到一个很大的数字。它仍然抛出同样的错误。
注意:oracle 查询在 SQL 开发人员中运行良好。
【问题讨论】: