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

使用Oracle.DataAccess.Client调用存储过程遇ORA-06550错误求助

嘿,别着急,三周没搞定这个问题肯定超闹心的,我来帮你梳理下问题出在哪!

问题分析与解决方案

你遇到的ORA-06550和wrong number or types of arguments错误,核心原因是调用存储过程时没有指定完整的包名,Oracle无法定位到PRC_ABCD_GETALL这个存储过程,导致参数匹配失败。

1. 最关键的修改:指定完整的存储过程路径

你的存储过程是定义在V4_EVT_PKG_ABCD_GENERAL包内的,所以C#代码的CommandText必须写成包名.存储过程名,而不是只写存储过程名:

修改前:

cmd.CommandText = "PRC_ABCD_GETALL";

修改后:

cmd.CommandText = "V4_EVT_PKG_ABCD_GENERAL.PRC_ABCD_GETALL";

Oracle如果只看到存储过程名,会去查找全局存储过程,而不是包内的,所以找不到正确的程序时就会抛出参数不匹配的错误。

2. 其他需要注意的细节

除了核心修改,还有几个小细节可以优化,避免后续踩坑:

  • 参数名匹配:你代码里的参数名resultset_out和存储过程完全一致,这点没问题(Oracle默认不区分参数名大小写,但保持一致更稳妥)。
  • 资源释放:OracleDataReader和OracleCommand最好用using语句包裹,确保资源正确释放,避免内存泄漏:
    using (OracleCommand cmd = new OracleCommand()) {
        // ... 命令配置代码
        using (OracleDataReader rdr = cmd.ExecuteReader()) {
            while (rdr.Read()) {
                result.Add(Construct(rdr));
            }
        }
    }
    
  • 连接字符串验证:确保cnn变量里的连接字符串是适配Oracle.DataAccess.Client的格式,比如包含User Id=xxx;Password=xxx;Data Source=xxx;这些必要项。

3. 完整的修正后代码

整合所有修改后的GetAll方法:

public static IEnumerable<PortalList> GetAll() {
    string cnn = "connectionstring"; // 替换为你的Oracle连接字符串
    var result = new List<PortalList>();
    using (OracleConnection conn = new OracleConnection(cnn)) {
        conn.Open();
        using (OracleCommand cmd = new OracleCommand()) {
            cmd.Connection = conn;
            cmd.CommandText = "V4_EVT_PKG_ABCD_GENERAL.PRC_ABCD_GETALL";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("resultset_out", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
            using (OracleDataReader rdr = cmd.ExecuteReader()) {
                while (rdr.Read()) {
                    result.Add(Construct(rdr));
                }
            }
        }
    }
    return result;
}

4. 存储过程与包的验证

你的存储过程和包定义是正确的:

  • 包声明里正确定义了带OUT TYPES.cursorType参数的存储过程
  • 存储过程体里正确打开游标并返回ABCD表的查询结果
    只要TYPES.cursorType是提前创建好的全局游标类型(比如CREATE OR REPLACE TYPE cursorType IS REF CURSOR;),这部分就没有问题。

按照上面的修改,应该就能解决你遇到的错误了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:54:27