PgAdmin中递归查询出现PERFORM语法错误,求存储过程排障
解决PostgreSQL递归CTE中的PERFORM语法错误问题
错误原因
递归CTE(WITH RECURSIVE)的每个分支必须是返回结果集的SELECT语句,而PERFORM是PL/pgSQL专属的执行语句,仅用于执行不需要返回结果的操作,不能出现在CTE的定义逻辑里。你在递归分支里写的PERFORM n+1 FROM t WHERE n < 3违反了这个规则,导致语法报错。
修正后的代码
把递归分支的PERFORM替换成SELECT,保留外层的PERFORM来执行统计查询(避免返回结果),修改后的完整代码如下:
DO $proc$ DECLARE StartTime timestamptz; EndTime timestamptz; Delta double precision; BEGIN StartTime := clock_timestamp(); WITH RECURSIVE t(n) AS ( VALUES (1) UNION ALL SELECT n+1 FROM t WHERE n < 3 ) PERFORM sum(n) FROM t; EndTime := clock_timestamp(); Delta := 1000 * ( extract(epoch from EndTime) - extract(epoch from StartTime) ); RAISE NOTICE 'Duration in millisecs=%', Delta; END; $proc$;
运行效果说明
修正后执行代码,会正常输出类似如下的结果:
NOTICE: Duration in millisecs=0.106 DO Query returned successfully in 6 secs 898 msec.
内容的提问来源于stack exchange,提问作者Addisu Foryou1
相关产品推荐
相关产品推荐

