PostgreSQL中表名为name时自定义函数调用报错如何解决?
你遇到的问题根源和name的特殊身份有关:PostgreSQL本身存在内置name数据类型,你定义函数时参数写的n name会被优先解析为内置类型,而非你name表对应的复合行类型,导致实际调用时传入public.name行类型找不到匹配签名的函数。
解决方案
只需要在定义函数时,明确指定参数的类型是你的表对应的复合类型即可,有两种常用写法:
方法1:加模式名限定
函数定义的参数部分明确加表所属的模式(默认一般是public,可按实际情况修改):
CREATE OR REPLACE FUNCTION compile_name_search_terms(n public.name) RETURNS text AS $$ BEGIN return n.id || ' ' || COALESCE(n.full_name, '') || ' ' || COALESCE(n.phone, '') || ' ' || regexp_replace(COALESCE(n.phone, ''), '[\(\)-]', '', 'g'); END $$ LANGUAGE plpgsql;
方法2:用双引号包裹表名
强制PostgreSQL将name解析为标识符(你的表名)而非内置类型:
CREATE OR REPLACE FUNCTION compile_name_search_terms(n "name") RETURNS text AS $$ BEGIN return n.id || ' ' || COALESCE(n.full_name, '') || ' ' || COALESCE(n.phone, '') || ' ' || regexp_replace(COALESCE(n.phone, ''), '[\(\)-]', '', 'g'); END $$ LANGUAGE plpgsql;
修改完成后再执行原来的查询语句即可正常运行:
SELECT id, compile_name_search_terms(t) FROM name AS t;
内容的提问来源于stack exchange,提问作者StillLearnin
相关产品推荐
相关产品推荐

