【问题标题】:Converting oracle query to ado.net query not working将 oracle 查询转换为 ado.net 查询不起作用
【发布时间】: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 开发人员中运行良好。

【问题讨论】:

    标签: c# oracle ado.net


    【解决方案1】:

    您不需要匿名 PL/SQL 块。您可以简单地调用该过程

    string query2 = @"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;";
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = query2;
    
    var result = new OracleParameter("result", OracleDbType.Decimal, 200, null, ParameterDirection.ReturnValue);
    ... adding Input parameters
    

    【讨论】:

      【解决方案2】:

      在头疼了很多之后,我得到了朋友的帮助。代码中有几个问题。 1. 将查询更改为以下,使其返回正确的值

      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);
              :result := result;
          end;";
      

      2。验证正在传递的数据 i_whse = "008" 但它只是读取为“8”修复它。 3.验证参数方向

      var result = new OracleParameter("result", OracleDbType.Int32, 200, null, 
          ParameterDirection.ReturnValue);
      cmd.Parameters.Add(result);
      var caseNumber = new OracleParameter("o_case_nbr", OracleDbType.Varchar2, 20, null,
          ParameterDirection.InputOutput);
      cmd.Parameters.Add(caseNumber);
      var error = new OracleParameter("o_error", OracleDbType.Varchar2, 2048, null, 
          ParameterDirection.Output);
      cmd.Parameters.Add(error);
      

      4。还根据实际大小和精度更新了参数。

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 2019-07-29
        • 2018-11-01
        • 2013-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2016-07-29
        相关资源
        最近更新 更多