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

触发器函数递归逻辑报错:perform语法错误及结果存储需求

PostgreSQL触发器递归CTE问题修复

你遇到的错误

ERROR: syntax error at or near "perform"
LINE 10: perform * from "test";
^
SQL state: 42601
Character: 221

ERROR: recursive inside the trigger function

错误根源

  1. 触发器函数采用PL/pgSQL语法,你之前写的perform * from "test";或直接SELECT * FROM "test";不符合规范:PL/pgSQL中如果不需要将查询结果赋值给变量,必须用PERFORM执行无返回查询,但这行本身完全多余,没必要保留。
  2. 旧版PostgreSQL对触发器内使用递归CTE支持有限,不过新版已修复该问题,核心问题还是你的CTE与插入操作的写法不符合PL/pgSQL执行逻辑。

修正后的代码

BEGIN
    WITH RECURSIVE "test" AS (
        SELECT "node_f", "node_2", "edge"
        FROM "con" 
        WHERE "node_f" = new."origin"
        UNION
        SELECT O."node_f", O."node_2", O."edge"
        FROM "test" N
        JOIN "con" O ON O."node_f" = N."node_2"
    )
    INSERT INTO "extract"
    SELECT * FROM "test";

    RETURN new;
END;

核心修改说明

  • 移除了多余的单独查询行,将递归CTE与插入操作合并为一个语句,直接把递归查询结果写入extract表,符合PL/pgSQL执行规则。
  • 需确保extract表的字段数量、类型与递归CTE返回的字段(node_f、node_2、edge)完全匹配,否则会触发字段不匹配的插入错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:15:16