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
相关产品推荐
相关产品推荐

