【发布时间】:2019-06-07 11:13:54
【问题描述】:
我有一个带有以下签名和局部变量的存储过程:
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 调用 proc 时,它执行得很好。
【问题讨论】:
-
您使用的是哪个数据库和驱动程序版本?听起来您的参数默认为数据库不期望的最大大小,这可能是版本冲突。不确定是否可以将大小指定为 oracleParameter 设置的一部分?
-
我的数据库是 Oracle 12c v12.1.0.2.0,我能找到的唯一“驱动程序”版本是
Oracle.ManagedDataAccess包,它是 v4.122.1.0。我找不到任何指定参数大小的方法。我唯一尝试过的是传递各种大小的byte[](尤其是byte[16])和stringvars 作为参数值,但似乎没有大小起作用。 -
oracleParameter.Size = 16inCreateParameterRaw不起作用吗? -
@MatthewMcPeak 是的,这是缺少的,但在下面接受的答案中。
标签: oracle exception stored-procedures parameters