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

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;

代码说明

  1. format('%I', table_name):用%I将表名转为合法的SQL标识符,避免表名含特殊字符或SQL注入。
  2. array(SELECT quote_ident(c) FROM unnest(columns_to_display) c):遍历列名数组,用quote_ident处理每个列名,确保列名合法。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:22:27