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

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参数的返回值,两种常用调用场景:

  1. 在PL/pgSQL代码块中调用:
DO $$
DECLARE
    return_flag varchar(10); -- 定义变量承接返回值
BEGIN
    CALL duplicate_config_v1(1, '1'::varchar, 1, 1, return_flag);
    -- 后续可直接使用return_flag变量获取返回结果
END $$;
  1. 在数据库客户端直接交互调用:
-- 传入会话变量占位承接返回值
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:15:41