У меня есть хранимая процедура со следующей сигнатурой и локальными переменными:
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.