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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:45:06