调用PostgreSQL存储过程传参报错:无匹配名称与参数类型
PostgreSQL存储过程调用报错解决方案
修正存储过程删除语句
你写的DROP PROCEDURE语句存在语法问题:指定参数时不需要写参数名,仅需声明类型。原语句里的date text会被PostgreSQL误判为参数名加类型组合,导致删除操作无法匹配目标存储过程。正确写法:
DROP PROCEDURE IF EXISTS updateTransactionsFromBackups(text);
重新创建存储过程
先执行上面的修正版删除语句,再重新运行你的存储过程创建脚本,确保存储过程成功生成。
验证存储过程存在性
在psql终端执行以下命令,确认存储过程是否存在且参数类型匹配:
\df updateTransactionsFromBackups
或者通过系统表查询:
SELECT proname, oidvectortypes(proargtypes) AS args FROM pg_proc WHERE proname = 'updatetransactionsfrombackups';
检查结果中是否存在参数类型为text的对应存储过程。
正确调用存储过程
调用时无需显式转换text类型(字符串字面量默认就是text类型),直接执行:
CALL updateTransactionsFromBackups('2023-03-13');
额外修复:COPY语句的动态路径问题
另外,你的存储过程里COPY直接使用变量path会报错——PostgreSQL的COPY语法不支持直接用变量作为文件路径,必须通过动态SQL处理:
BEGIN path := '/var/www/old_backup_' || date || '.sql'; EXECUTE format('COPY old_transactions(id,user_id) FROM %L NULL AS ''NULL'' DELIMITER E''\t'' CSV HEADER', path); END;
用format函数的%L占位符可以自动转义路径字符串,同时避免SQL注入风险。
内容的提问来源于stack exchange,提问作者matin
相关产品推荐
相关产品推荐

