PostgreSQL中无法执行自定义sum函数 提示接近')'处存在语法错误
问题原因及修复方案
错误根因
sum是PostgreSQL内置的聚合函数,自定义函数重名会导致解析器识别冲突,这是你收到「在")"处或附近存在语法错误」的核心原因INSERT ... RETURNING id得到的id没有赋值给变量,直接在后续UPDATE语句中引用id会触发变量未定义的报错- 直接在SQL上下文用
EXECUTE调用函数是错误用法:EXECUTE是PL/pgSQL块内的语法,普通SQL上下文直接用SELECT调用无返回值函数即可,只有PL/pgSQL块内调用不需要接收返回值的函数才需要用PERFORM
修复后完整代码
-- 重命名函数避免和内置sum函数冲突 CREATE OR REPLACE FUNCTION set_product_default_margins() RETURNS VOID AS $$ DECLARE ea bigint; v_margin_id bigint; -- 新增变量存储插入返回的margin id BEGIN FOR ea IN SELECT ean FROM ws_products WHERE order_code LIKE 'BIL%' LOOP -- 把returning的id赋值给变量 INSERT INTO ws_products_margins (type, amount) VALUES ('PERSENTAGE', 30.00) RETURNING id INTO v_margin_id; UPDATE ws_products SET margin_id = v_margin_id WHERE ean = ea; END LOOP; RETURN; END; $$ LANGUAGE plpgsql; -- 普通SQL上下文直接调用即可,不需要execute SELECT set_product_default_margins();
可选优化方案
不需要写PL/pgSQL函数就能实现同等逻辑,避免循环逐行操作的性能损耗:
WITH inserted_margins AS ( INSERT INTO ws_products_margins (type, amount) SELECT 'PERSENTAGE', 30.00 FROM ws_products WHERE order_code LIKE 'BIL%' RETURNING id, (row_number() OVER ()) AS rn ), target_products AS ( SELECT ean, (row_number() OVER ()) AS rn FROM ws_products WHERE order_code LIKE 'BIL%' ) UPDATE ws_products p SET margin_id = im.id FROM target_products tp JOIN inserted_margins im ON tp.rn = im.rn WHERE p.ean = tp.ean;
内容的提问来源于stack exchange,提问作者kostiantynn
相关产品推荐
相关产品推荐

