PostgreSQL函数调用报错:无匹配名称与参数类型的函数
解决PostgreSQL函数参数类型不匹配报错
报错原因分析
触发报错的核心是两个类型不匹配问题:
- 函数定义中
_dob参数类型为timestamp,但调用时传入的current_timestamp返回的是timestamp with time zone(PostgreSQL中缩写为timestamptz),两者类型不兼容。 - 传入的字符串参数被识别为
unknown类型,虽然PostgreSQL通常能隐式转换为character varying,但结合时间类型的不匹配,直接触发了"函数不存在"的报错。
解决方案
方案1:修改函数参数类型,适配调用传入的时间类型
将函数中_dob的类型从timestamp改为timestamp with time zone,和current_timestamp的返回类型完全匹配:
CREATE OR REPLACE FUNCTION public.udf_insertcontact( _pid integer, _firstname character varying(30), _lastname character varying(30), _emailaddress character varying(100), _company character varying(50), _category character varying, _gender character varying, _dob timestamp with time zone, -- 修改此处类型 _modeslack boolean, _modewhatsapp boolean, _modeemail boolean, _modephone boolean, _contactimage character varying) RETURNS integer LANGUAGE 'plpgsql' AS $BODY$ BEGIN INSERT INTO public.tblcontacts( professionid, firstname, lastname, emailaddress, company, category, gender, dob, modeslack, modewhatsapp, modeemail, modephone, contactimage) VALUES ( _pid, _firstname, _lastname, _emailaddress, _company, _category, _gender, _dob, _modeslack, _modewhatsapp, _modeemail, _modephone, _contactimage); IF FOUND THEN -- INSERTED SUCCESSFULLY RETURN 1; ELSE RETURN 0; -- INSERTED FAIL END IF; END $BODY$;
方案2:调用时显式转换时间参数类型
保持函数定义不变,调用时将current_timestamp转换为timestamp类型:
SELECT public.udf_insertcontact(2,'first','last','email@e.com','company','Client','Female',current_timestamp::timestamp,false,true,false,true,'');
也可以使用CAST语法完成转换:
SELECT public.udf_insertcontact(2,'first','last','email@e.com','company','Client','Female',CAST(current_timestamp AS timestamp),false,true,false,true,'');
额外说明
如果字符串参数的unknown类型仍导致问题,可以显式转换为对应长度的character varying,例如将'first'改为'first'::varchar(30),但通常PostgreSQL会自动完成该隐式转换,无需额外操作。
内容的提问来源于stack exchange,提问作者Sachin Chahal
相关产品推荐
相关产品推荐

