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

调用Oracle包内函数出现PLS-00306参数错误的排查请求

排查PLS-00306:C#调用Oracle包函数参数错误问题

针对你遇到的C#调用Oracle包函数报PLS-00306,但TOAD能正常执行的问题,从以下几个方向排查:

  • 参数名称严格匹配
    Oracle PL/SQL对参数名称的大小写敏感(若定义时未加双引号则默认大写),确保C#中传入的参数名称和函数定义的参数名完全一致,比如函数定义为FUNCTION_NAME(p_job_name IN VARCHAR2),C#里参数名必须是p_job_name,不能用jobName这类别名。

  • 参数类型精准对应
    确认Oracle函数的参数类型(如VARCHAR2(50))和C#中的参数类型、长度完全匹配:

    • 输入参数用OracleDbType.Varchar2而非OracleDbType.Char,避免隐式转换失败;
    • 返回值参数要对应Oracle的NUMBER类型,C#中设为OracleDbType.Int32或OracleDbType.Decimal,并标记为ParameterDirection.ReturnValue。
  • 调用路径完全一致
    检查C#代码中是否完整指定了模式名、包名和函数名,和TOAD中执行的SCHEMANAME.PACKAGE_NAME.FUNCTION_NAME完全一致,不要遗漏模式名或写错包/函数名的大小写。

  • 排查自定义ExecuteStoredFunction的实现问题
    重点检查这个方法是否存在以下问题:

    • 是否多添加了参数,导致传递的参数数量超过函数定义;
    • 参数绑定顺序错误(按位置绑定时,必须和函数参数顺序一致);
    • 未正确配置返回值参数的方向和类型。

举个参数配置的正确示例(基于OracleClient):

// 配置返回值参数
var returnParam = new OracleParameter
{
    OracleDbType = OracleDbType.Int32,
    Direction = ParameterDirection.ReturnValue
};

// 配置输入参数
var jobNameParam = new OracleParameter("p_job_name", OracleDbType.Varchar2, 50)
{
    Value = "JOB_NAME"
};

// 添加到命令对象(按位置绑定时,返回值参数需放在第一位)
cmd.Parameters.Add(returnParam);
cmd.Parameters.Add(jobNameParam);
  • 检查输入值的长度与字符
    如果传入的作业名称长度超过Oracle函数参数定义的VARCHAR2长度,或包含特殊字符导致隐式转换异常,也会触发该报错,确认输入值符合函数的参数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:22:42