Что не так с моим параметром возврата Oracle RAW? - PullRequest
1 голос
/ 07 июня 2019

У меня есть хранимая процедура со следующей сигнатурой и локальными переменными:

PROCEDURE contract_boq_import(i_project_id IN RAW, 
                      i_boq_id IN RAW,
                      i_master_list_version IN NUMBER,
                      i_force_update_if_exists IN BOOLEAN, 
                      i_user_id IN NUMBER,
                      o_boq_rev_id OUT RAW) AS
  v_contract_id          RAW(16);
  v_contract_no          VARCHAR2(100);
  v_series_rev_id_count  NUMBER(1);
  v_project_id_count     NUMBER(5);
  v_now                  DATE;
  v_boq_import_rev_id    RAW(16);
  v_master_project_id    RAW(16);
  v_prj_duplicate_items  VARCHAR2(1000) := '';

Я установил выходной параметр, используя одну из наших утилит DAL:

var revParam = new byte[16];
dataHandler.CreateParameterRaw("o_boq_rev_id", revParam).Direction = ParameterDirection.Output;

Где CreateParameterRaw объявляется как:

public DbParameter CreateParameterRaw(string name, object value)
{
  OracleParameter oracleParameter = new OracleParameter();
  oracleParameter.ParameterName = name;
  oracleParameter.OracleDbType = OracleDbType.Raw;
  oracleParameter.Value = value;
  this.Parameters.Add((DbParameter) oracleParameter);
  return (DbParameter) oracleParameter;
}

Затем, когда я выполняю процедуру с ExecuteNonQuery, я получаю следующую ошибку:

Oracle.ManagedDataAccess.Client.OracleException
  HResult=0x80004005
  Message=ORA-06502: PL/SQL: numeric or value error: raw variable length too long
ORA-06512: at "ITIS_PRCDRS.PA_PRJ_IMP", line 1235

Исключение выдается в строке 1235:

o_boq_rev_id := v_boq_import_rev_id;

Как вы можете видеть из описания процедуры выше, v_boq_import_rev_id имеет тип RAW(16), а o_boq_rev_id имеет тип OUT RAW, так почему же при назначении в строке 1235 происходит сбой?Что я делаю не так?

PS: Процесс работает нормально, когда я вызываю его на простом PL / SQL.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

В OracleParameter размер по умолчанию равен 0 для параметров, которые могут иметь значения размера.(Официальная ссылка здесь .)

Вот почему вам нужно изменить метод, который генерирует необработанные значения.Ниже вы можете найти модифицированный метод:

public DbParameter CreateParameterRaw(string name, object value, int parameterSize)
{
  OracleParameter oracleParameter = new OracleParameter();
  oracleParameter.ParameterName = name;
  oracleParameter.OracleDbType = OracleDbType.Raw;
  oracleParameter.Value = value;
  oracleParameter.Size = parameterSize; /* THIS IS THE ADDED PARAMETER */
  this.Parameters.Add((DbParameter) oracleParameter);
  return (DbParameter) oracleParameter;
}

И в результате вы можете передать размер при вызове CreateParameterRaw, как вы делали в существующем коде:

var revParam = new byte[16];
/* CHECK THE 16 value in the parameters that are sent to CreateParameterRaw */
dataHandler.CreateParameterRaw("o_boq_rev_id", revParam, 16).Direction = ParameterDirection.Output;

Дополнительное предложение : Чтобы сохранить яблоки с яблоками, я бы посоветовал вам ввести параметр Direction также в метод CreateParameterRaw.Таким образом, CreateParameterRaw становится полностью ответственным за генерацию параметров.


Кредиты :

0 голосов
/ 10 июня 2019

Это интересная проблема со странным решением.

На самом деле при использовании RAW в выходном параметре вы ДОЛЖНЫ предоставить ему некоторое буферное пространство при добавлении этого параметра.

Можете ли вы предоставитьнекоторое буферное пространство для этой переменной и попробуйте что-то вроде следующего:

byte[] RAWPlaceholder = new byte[16];

cmd.AddParameter(new OracleParameter("o_boq_rev_id", 
                                  OracleDbType.Raw,  
                                  16, 
                                  RAWPlaceholder, 
                                  ParameterDirection.Output);

Пожалуйста, поделитесь результатом вышеупомянутого упражнения.

Спасибо

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