在Bash中调用PostgreSQL存储过程my_proc报错找不到匹配过程如何解决?
PostgreSQL存储过程
my_proc调用报错解决方案 报错根因
出现该问题的核心原因有两点:
- INOUT类型参数要求传入可被赋值的对象,你直接传入字面量
0作为第四个参数时,PostgreSQL会将其识别为普通IN参数,无法匹配你定义的带INOUT参数的存储过程签名 - 字符串字面量默认类型推导存在优先级差异,即便做了普通的字符类型转换,也可能因长度校验、签名推导顺序问题导致匹配失败
可行解决方案
方案1:使用psql变量承接INOUT返回值+显式强转所有参数类型
修改你的psql调用段为以下内容即可:
psql -d magadb -U exploit -q <<EOF \set QUIET on set datestyle='SQL, DMY'; \set LC_TIME='French'; -- 提前定义变量承接INOUT参数返回值 \set res 0 CALL my_proc( 'P'::VARCHAR(1), 0::INT, 0::INT, :res::INT ); -- 若需要打印返回结果,可新增下面这行 -- SELECT :res AS 存储过程返回值; EOF
方案2:用PL/pgSQL匿名块包裹调用(兼容性更强)
如果方案1仍存在类型匹配问题,可以用匿名块完全规避类型推导问题:
psql -d magadb -U exploit -q <<EOF \set QUIET on set datestyle='SQL, DMY'; \set LC_TIME='French'; DO $$ DECLARE v_res INT := 0; BEGIN CALL my_proc('P'::VARCHAR(1), 0::INT, 0::INT, v_res); -- 需要输出返回值可放开下面注释 -- RAISE NOTICE '存储过程返回值:%', v_res; END $$; EOF
排查验证手段
如果修改后仍报错,可先登录psql交互界面执行\df my_proc命令,查看存储过程的实际参数签名,确认参数的顺序、类型、输入输出属性和你定义的一致,排除定义阶段的笔误问题。
内容的提问来源于stack exchange,提问作者Majd
相关产品推荐
相关产品推荐

