触发器函数递归逻辑报错: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
错误根源
- 触发器函数采用PL/pgSQL语法,你之前写的
perform * from "test";或直接SELECT * FROM "test";不符合规范:PL/pgSQL中如果不需要将查询结果赋值给变量,必须用PERFORM执行无返回查询,但这行本身完全多余,没必要保留。 - 旧版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
相关产品推荐
相关产品推荐

