You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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的执行权限,且存储过程确实存在于DB schema下。若存储过程创建时使用了大小写敏感名称,需在调用时用双引号包裹(如"DB."MY_PROCEDURE"")。

内容的提问来源于stack exchange,提问作者Luis Badel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:12:29