调用Oracle存储过程报PLS-00306:参数数量或类型不符求助
.NET调用Oracle存储过程报PLS-00306错误排查
问题描述
我有一个.NET应用,尝试调用Oracle存储过程,代码实现如下:
private void Method(Company company) { string json = JsonConvert.SerializeObject(company.Object); var parameters = new List<OracleParameter> { new OracleParameter("ID", OracleDbType.Int32, company.Id, ParameterDirection.Input), new OracleParameter("ACTIVITY", OracleDbType.Varchar2, json, ParameterDirection.Input) }; _oracleDataAdapter.ExecuteProcedure<ObjectModel>("DB.MY_PROCEDURE", parameters); }
对应的Oracle存储过程定义:
PROCEDURE MY_PROCEDURE ( ID IN NUMBER, ACTIVITY IN VARCHAR2 ) AS BEGIN INSERT INTO DB.TABLE (ID, ACTIVITY) VALUES (ID, ACTIVITY); END MY_PROCEDURE
已确认存储过程名称、参数名称完全一致,但执行时仍报错:
PLS-00306: wrong number or types of arguments in call to DB.MY_PROCEDURE
补充说明:使用Oracle.ManagedDataAccess.Client NuGet包,已测试Int16/Int32/Int64/Long/Decimal/Double等对应Oracle NUMBER类型的枚举值,问题未解决。
排查与解决思路
显式指定Varchar2参数长度:Oracle的Varchar2类型需要明确参数大小,未指定时可能触发类型不匹配。修改ACTIVITY参数定义,添加长度设置:
// 方式1:根据实际JSON长度设置 new OracleParameter("ACTIVITY", OracleDbType.Varchar2, json.Length, json, ParameterDirection.Input) // 方式2:指定固定最大长度(根据业务需求调整,比如4000或32767) new OracleParameter("ACTIVITY", OracleDbType.Varchar2, 4000) { Value = json, Direction = ParameterDirection.Input }启用参数按名称绑定:确保OracleCommand使用名称匹配参数,而非默认的位置匹配。给所有参数设置
BindByName = true:parameters.ForEach(p => p.BindByName = true);如果
ExecuteProcedure内部封装了OracleCommand创建逻辑,需确保该Command的BindByName属性被设为true。处理数值参数的空值与类型匹配:确认
company.Id无空值,若存在空值需显式赋值DBNull.Value,同时尝试使用OracleDbType.Decimal适配NUMBER类型:new OracleParameter("ID", OracleDbType.Decimal) { Value = company.Id ?? DBNull.Value, Direction = ParameterDirection.Input, Precision = 10, // 根据存储过程中NUMBER的精度调整 Scale = 0 }验证存储过程权限与Schema:确认.NET应用的Oracle连接用户拥有
DB.MY_PROCEDURE的执行权限,且存储过程确实存在于DBschema下。若存储过程创建时使用了大小写敏感名称,需在调用时用双引号包裹(如"DB."MY_PROCEDURE"")。
内容的提问来源于stack exchange,提问作者Luis Badel
相关产品推荐
相关产品推荐

