PL/pgSQL函数执行RETURN QUERY时出现列不存在错误
问题分析与修复
核心错误原因
- 字符串标识符混淆:PostgreSQL中双引号
""用于引用表/列等标识符,你用双引号包裹format的SQL模板,数据库会把整个SQL片段当成列名查找,导致"列不存在"错误。必须用单引号''或美元符$$包裹字符串。 - 动态SQL语法错误:原SQL缺少
WHERE关键字,且末尾的!=0没有关联任何列,属于无效条件。 - 函数稳定性不匹配:
IMMUTABLE类型函数要求结果完全由输入参数决定,但你用了NOW()(不稳定函数,每次调用结果不同),必须改为STABLE。 - 调用函数名错误:你调用的
end_to_end_query(4)和定义的my_query不一致,需统一。
修复后的函数代码
CREATE OR REPLACE FUNCTION my_query(part_id integer) RETURNS TABLE ( event_at timestamp, id integer, code varchar, is_test boolean ) LANGUAGE plpgsql STABLE -- 改为STABLE AS $function$ DECLARE -- 用美元符包裹模板字符串,避免单引号转义问题;添加WHERE,修正条件(假设是id !=0,可根据实际调整) query varchar := format($$SELECT date_trunc('hour', event_at), id, code, is_test FROM metric_events_%s WHERE event_at < date_trunc('hour', NOW() - interval '1 hour') AND id != 0$$, part_id); BEGIN RAISE NOTICE 'Value: %', query; RETURN QUERY EXECUTE query; END $function$;
正确调用方式
SELECT * FROM my_query(4); -- 注意函数名统一,且需要用FROM调用表函数
注:如果
!=0不是针对id的条件,你可以根据实际业务逻辑替换为正确的列和判断规则。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

