PostgreSQL自定义seecols函数报错:查询结构与返回类型不匹配
解决PostgreSQL自定义函数返回类型不匹配问题
报错原因是你定义的函数返回表字段类型,和information_schema.columns查询结果的实际类型不严格匹配。column_name实际类型是information_schema.sql_identifier,data_type是information_schema.character_data,尽管和varchar兼容,但PostgreSQL执行时会因为类型不严格匹配抛出错误。
下面是两种修正方案:
方案1:匹配原字段的精确类型
直接修改函数返回类型定义,和查询源字段类型保持一致:
CREATE OR REPLACE FUNCTION seecols(table_name text) RETURNS TABLE (column_name information_schema.sql_identifier, data_type information_schema.character_data) AS $func$ DECLARE _query varchar; BEGIN -- 按字母顺序显示列 _query := 'SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '''||table_name||''' ORDER BY column_name ASC'; RETURN QUERY EXECUTE _query; END; $func$ LANGUAGE plpgsql;
方案2:动态查询中显式转换类型
如果想保留varchar的返回类型定义,在动态SQL里把字段转换为varchar:
CREATE OR REPLACE FUNCTION seecols(table_name text) RETURNS TABLE (column_name varchar, data_type varchar) AS $func$ DECLARE _query varchar; BEGIN -- 按字母顺序显示列 _query := 'SELECT column_name::varchar, data_type::varchar FROM information_schema.columns WHERE table_name = '''||table_name||''' ORDER BY column_name ASC'; RETURN QUERY EXECUTE _query; END; $func$ LANGUAGE plpgsql;
注意调用方式
调用函数时建议用以下方式,直接获取分列的结果:
SELECT * FROM seecols('organizations');
内容的提问来源于stack exchange,提问作者aarkerio
相关产品推荐
相关产品推荐

