.NET Core调用带OUT参数的PostgreSQL存储过程时触发42883错误:存储过程不存在
我来帮你捋清楚这个问题,PostgreSQL抛出的42883错误本质是找不到匹配签名的存储过程,问题根源出在你调用存储过程的语法上,和你的.NET Core代码参数设置的逻辑无关。
为什么会出现这个错误?
PostgreSQL对存储过程的签名匹配是严格包含所有参数的——不管是IN、OUT还是INOUT参数,都会被算进存储过程的签名里。你代码里的CALL usp_delete_announcements(@in_id)语句只传入了1个IN参数,但你的实际存储过程应该是包含1个IN + 3个OUT参数的(总共4个参数),所以PostgreSQL会去寻找仅接收1个IN参数的usp_delete_announcements,自然找不到,就抛出了“不存在”的错误。
怎么解决?
你需要修正CALL语句,把所有参数(包括OUT参数的占位符)都明确列出来,让PostgreSQL能匹配到正确的存储过程签名。具体修改如下:
修正后的完整代码
using (NpgsqlConnection conn = new NpgsqlConnection(connectionString)) { conn.Open(); // 关键修改:在CALL语句中添加所有OUT参数的占位符 using (NpgsqlCommand cmd = new NpgsqlCommand("CALL usp_delete_announcements(@in_id, @out_announcements_id, @out_error_code, @out_message)", conn)) { cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@in_id", Convert.ToInt32(strDecryptedId)); // 以下OUT参数的设置无需改动 cmd.Parameters.Add("@out_announcements_id", NpgsqlTypes.NpgsqlDbType.Integer).Direction = ParameterDirection.Output; cmd.Parameters.Add("@out_error_code", NpgsqlTypes.NpgsqlDbType.Integer).Direction = ParameterDirection.Output; cmd.Parameters.Add("@out_message", NpgsqlTypes.NpgsqlDbType.Varchar).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); response.Id = (int)cmd.Parameters["@out_announcements_id"].Value; response.Message = cmd.Parameters["@out_message"].Value.ToString(); } }
额外需要确认的几个点
核对存储过程的实际定义
你可以在PostgreSQL的psql工具里执行\df+ usp_delete_announcements,或者通过查询系统表确认存储过程的完整参数列表:SELECT parameter_name, mode, data_type FROM information_schema.parameters WHERE specific_name = 'usp_delete_announcements';确保参数的数量、类型、方向(IN/OUT)和你代码里的设置完全匹配。
关于CommandType的说明
你设置的cmd.CommandType = CommandType.Text;是完全正确的,Npgsql对PostgreSQL存储过程的调用推荐用文本执行CALL语句,不要用CommandType.StoredProcedure(这个更多是为兼容SQL Server等数据库的存储过程调用逻辑)。参数名称的一致性
确认你代码里的参数名称(比如@in_id)和存储过程定义里的参数名称完全一致,PostgreSQL会根据名称匹配参数,避免因为名称不匹配导致的隐性错误。
备注:内容来源于stack exchange,提问作者yaminisai

