Преобразование oracle запроса в ado. net запрос не работает - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь написать ado. net запрос в c#. Ниже приведен запрос.

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 разработчику.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вам не нужен анонимный блок 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
0 голосов
/ 03 марта 2020

После долгих ударов головой я воспользовался помощью друга. В коде было несколько проблем. 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. Также обновлены параметры с фактическим размером и точностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...