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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:27:14