PostgreSQL调用存储过程提示参数类型不匹配错误如何解决?
PostgreSQL存储过程调用报错修复方案
错误核心原因
PostgreSQL通过存储过程名称+参数类型列表唯一识别存储过程,你遇到的42883错误是传入参数的类型、顺序和你定义的存储过程不匹配,具体问题:
- 存储过程定义的参数顺序为:
IMEI bigint、iccid text、phonenumber bigint、apn text、"Operator" text、isesim boolean、ism2m boolean、mdi bigint、imsi integer,报错显示你实际执行的调用语句参数顺序完全错位,第一个参数传入了字符串类型的iccid,和定义的第一个参数bigint类型不匹配 - 两个boolean类型参数你传入了字符串
'0',PostgreSQL无法自动将'0'字符串转换为boolean类型 - 存储过程内部存在潜在错误:
length(IMEI)中IMEI是bigint数值类型,length()仅支持字符串类型输入,运行会报错
修复步骤
- 第一步:修正存储过程内部逻辑,替换长度判断逻辑
CREATE OR REPLACE PROCEDURE "master_SIMs".simiccidlink1(IMEI bigint, iccid text, phonenumber bigint, apn text, "Operator" text, isesim boolean, ism2m boolean, mdi bigint, imsi integer) LANGUAGE 'plpgsql' AS $BODY$ begin -- 数值转字符串后再计算长度 if (length(IMEI::text) = 15) then if (master_packs.luhn_verify(IMEI) is True) then update "master_SIMs".list SET "ICCID" = iccid, "phoneNumber" = phonenumber, "APN" = apn, "operator" = "Operator", "isESIM" = isesim, "isM2M" = ism2m, "MDI" = mdi, "IMSI" = imsi where "serialNumber" = IMEI; end if; end if; end; $BODY$;
- 第二步:调用时使用命名参数传参,避免顺序错误,同时匹配参数类型:
CALL "master_SIMs".simiccidlink1( IMEI := 352277818466409, iccid := 'iccid1', phonenumber := 8018466080, apn := 'apn1', "Operator" := 'operator1', isesim := false, ism2m := false, mdi := 123456789987653, imsi := 12354 ); SELECT * FROM "master_SIMs".list;
小提示:如果业务上1对应true、0对应false,直接替换上面的
false为true即可,不要加引号。
内容的提问来源于stack exchange,提问作者user17476256
相关产品推荐
相关产品推荐

