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

PostgreSQL存储过程返回插入ID报错:如何绑定INOUT参数?

解决PostgreSQL存储过程中返回最后插入行ID的问题

你遇到的ERROR: query has no destination for result data错误,核心原因是你用了RETURNING子句但没指定返回值的存储目标——PostgreSQL不知道该把插入生成的prod_id存到哪里,所以抛出了这个错误。下面给你修正后的完整代码,我会把关键改动点说清楚:

修正后的存储过程代码

CREATE OR REPLACE PROCEDURE public.spproductinsertupdatedelete(
    _ser integer,
    _subcategid integer,
    _inrprice numeric,
    _usdprice numeric,
    _colour integer,
    _size integer,
    _qty integer,
    _prodid integer DEFAULT NULL::integer,
    INOUT _pid integer DEFAULT NULL
)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
    IF _ser = 1 THEN
        --- 插入操作:将返回的prod_id绑定到INOUT参数_pid
        INSERT INTO product (prod_subcateg_id, prod_inr_price, prod_usd_price, prod_colour, prod_size, prod_qty)
        VALUES (_subcategid, _inrprice, _usdprice, _colour, _size, _qty)
        RETURNING prod_id INTO _pid; -- 关键改动:用INTO把返回值赋值给你的INOUT参数
    ELSIF _ser = 2 THEN
        UPDATE product
        SET prod_subcateg_id = _subcategid,
            prod_inr_price = _inrprice,
            prod_usd_price = _usdprice,
            prod_size = _size,
            prod_colour = _colour,
            prod_qty = _qty
        WHERE prod_id = _prodid;
        -- 可选:如果需要在更新后也返回当前prod_id,解开下面的注释
        -- SELECT _prodid INTO _pid;
    ELSIF _ser = 3 THEN
        ---- 软删除操作:同样可选返回被删除的prod_id
        UPDATE product
        SET prod_datetill = now()
        WHERE prod_id = _prodid;
        -- SELECT _prodid INTO _pid;
    END IF;
END $BODY$;

关键改动说明

  • 在INSERT语句的RETURNING子句后添加INTO _pid,这就明确告诉数据库:把插入生成的prod_id赋值给你定义的INOUT参数,这样调用存储过程时就能拿到这个值。
  • 如果你需要在更新或软删除操作后也返回对应的ID,可以在对应分支里加上SELECT _prodid INTO _pid;,代码里已经加了注释,按需启用即可。

调用示例

你可以这样调用存储过程获取插入的ID:

CALL public.spproductinsertupdatedelete(
    1,          -- _ser=1表示执行插入操作
    101,        -- _subcategid
    599.00,     -- _inrprice
    7.99,       -- _usdprice
    3,          -- _colour
    'M'::integer,-- _size
    50,         -- _qty
    NULL,       -- _prodid(插入场景不需要传值)
    NULL        -- 传入NULL,存储过程会把新生成的prod_id赋值后返回
);

调用完成后,最后一个参数就会返回新插入行的prod_id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:12:51