PostgreSQL创建带返回值存储过程调用报不存在错误如何解决
报错原因
两个核心问题导致调用失败:
- 参数个数不匹配:你定义的存储过程共5个参数,最后一个
flag是INOUT类型(承担传入+返回值的作用,属于参数列表必填项),但调用时只传入了4个参数,PostgreSQL找不到签名为duplicate_config_v1(integer, character varying, integer, integer)的4参数存储过程,因此抛出对象不存在的错误。 - 存储过程内部逻辑不完整:过程内的查询语句没有将结果赋值给
flag参数,你原本写的赋值逻辑被注释,即使参数传对也拿不到预期的查询返回值。
正确创建与调用方式
方式1:继续使用PROCEDURE(适合需要在逻辑内执行事务提交/回滚的场景)
首先修正存储过程定义,补全赋值逻辑:
CREATE OR REPLACE PROCEDURE Duplicate_config_v1 ( sourcequoteid IN int, sourceconfig IN varchar, destinationquote IN int, scenarioid IN int, flag INOUT varchar(10) ) LANGUAGE plpgsql AS $$ BEGIN SELECT Status::varchar(10) INTO flag -- 将查询结果赋值给INOUT参数用于返回 FROM public.duplicate_scenario_statuses WHERE id = 1; END $$;
调用时必须传入对应变量承接INOUT参数的返回值,两种常用调用场景:
- 在PL/pgSQL代码块中调用:
DO $$ DECLARE return_flag varchar(10); -- 定义变量承接返回值 BEGIN CALL duplicate_config_v1(1, '1'::varchar, 1, 1, return_flag); -- 后续可直接使用return_flag变量获取返回结果 END $$;
- 在数据库客户端直接交互调用:
-- 传入会话变量占位承接返回值 CALL duplicate_config_v1(1, '1'::varchar, 1, 1, @res); -- 查询返回结果 SELECT @res;
方式2:使用FUNCTION(适合仅需返回计算/查询结果、不需要事务控制的场景)
如果你的逻辑不需要手动控制事务,用函数实现会更简洁,调用时不需要额外定义变量占位:
CREATE OR REPLACE FUNCTION Duplicate_config_v1 ( sourcequoteid int, sourceconfig varchar, destinationquote int, scenarioid int ) RETURNS varchar(10) LANGUAGE plpgsql AS $$ DECLARE flag varchar(10); BEGIN SELECT Status::varchar(10) INTO flag FROM public.duplicate_scenario_statuses WHERE id = 1; RETURN flag; END $$; -- 直接用SELECT调用即可拿到返回值 SELECT Duplicate_config_v1(1,'1'::varchar,1,1);
内容的提问来源于stack exchange,提问作者Mr Perfect
相关产品推荐
相关产品推荐

