PostgreSQL调用存储过程遇42883错误:无匹配的存储过程及参数类型
解决PostgreSQL存储过程调用42883错误
问题根源
错误提示明确指出:你调用时传入的参数类型是(character varying, character varying, date, integer, integer, character varying),但定义的存储过程参数类型是(character varying, character varying, date, smallint, smallint, character varying)。核心差异在于后两个参数:存储过程要求smallint类型,而你传入的是integer类型,PostgreSQL不会自动将integer隐式转换为smallint,因此找不到匹配的存储过程,触发42883错误。
解决方案
有两种直接可行的解决方式:
方式1:调用时显式转换参数类型
修改调用语句,将后两个整数参数强制转换为smallint:
CALL es_load_image('-59.74553210 -35.75147550'::varchar, 'C:/gis/photos/photo_13052022_162549.jpg'::varchar, '2022-05-13'::date, 3::smallint, 0::smallint, 'Just testing'::varchar);
方式2:修改存储过程参数类型(更通用)
如果业务场景中reporterid和categoryid的取值范围适合用integer类型,可直接修改存储过程的参数定义,将smallint改为integer,后续调用无需额外转换:
CREATE OR REPLACE PROCEDURE public.es_load_image( IN _coordinates character varying, IN _photo character varying, IN _report_date date, IN _reporterid integer, IN _categoryid integer, IN _description character varying) LANGUAGE plpgsql AS $$ BEGIN INSERT INTO image_points (geom, photo, report_date, reporterid, categoryid, description) VALUES(ST_GeomFromText('POINT('||_coordinates ||')', 4326), _photo, _report_date, _reporterid,_categoryid, _description); END; $$;
额外建议
- 检查
image_points表中reporterid和categoryid字段的实际类型,如果字段本身是integer,优先选择方式2,避免后续调用频繁做类型转换。 - 存储过程定义和调用时,尽量保持参数类型完全一致,减少隐式转换带来的问题。
内容的提问来源于stack exchange,提问作者Erick
相关产品推荐
相关产品推荐

