PostgreSQL函数报错[42804]:查询结构与函数结果类型不匹配求助
问题原因
函数声明返回TABLE(result_row json),但实际执行的SQL语句返回的是多个独立的非JSON类型列(比如first_name是character varying(20)),与函数定义的返回类型不匹配,触发了42804错误。
解决方法
需要将查询结果的每行转换为JSON对象,匹配函数声明的返回类型。推荐使用row_to_json函数将行数据转为JSON,同时通过format和quote_ident避免SQL注入风险。
修改后的函数代码
CREATE OR REPLACE FUNCTION display_columns_data(table_name varchar, columns_to_display varchar[]) RETURNS TABLE (result_row json) AS $$ BEGIN RETURN QUERY EXECUTE format('SELECT row_to_json(t) FROM (SELECT %s FROM %I) t', array_to_string(array(SELECT quote_ident(c) FROM unnest(columns_to_display) c), ','), table_name); END; $$ LANGUAGE plpgsql;
代码说明
format('%I', table_name):用%I将表名转为合法的SQL标识符,避免表名含特殊字符或SQL注入。array(SELECT quote_ident(c) FROM unnest(columns_to_display) c):遍历列名数组,用quote_ident处理每个列名,确保列名合法。row_to_json(t):将子查询t的每行数据打包为JSON对象,与函数返回的json类型匹配。
调用方式
保持原有调用语句不变:
SELECT * FROM display_columns_data('employees', ARRAY['first_name', 'last_name']);
执行后会返回类似如下的JSON结果:
{"first_name":"John","last_name":"Doe"} {"first_name":"Jane","last_name":"Smith"}
内容的提问来源于stack exchange,提问作者Atish
相关产品推荐
相关产品推荐

