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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:06:05