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

PostgreSQL自定义TEXT参数函数调用时参数被拆分报错如何解决

调用报错原因

你的报错是psycopg2传参的常见误用导致的:cursor.execute()方法的第二个参数要求传入元组/列表形式的参数序列,如果你直接传入单个字符串作为参数,psycopg2会将字符串视为可迭代对象,把每个字符拆分为独立的参数传入。你传入的293507407是9位字符串,刚好被拆成9个单字符参数,和你定义的单参数函数不匹配,因此触发函数不存在的报错。

错误的调用写法示例:

# 错误:直接将字符串作为第二个参数传入
cur.execute("SELECT fn(%s)", "293507407")

正确的调用写法:
即便是单个参数,也要封装成元组/列表传入,注意单个元素的元组末尾需要加逗号避免语法歧义:

# 写法1:用元组传参
cur.execute("SELECT fn(%s)", ("293507407",))

# 写法2:用列表传参
cur.execute("SELECT fn(%s)", ["293507407"])

函数本身的隐藏问题

你当前写的函数存在同名变量覆盖的问题:你在函数的DECLARE块中重复声明了和入参同名的param变量,这会导致外部传入的参数值被内部声明的变量覆盖,而内部新声明的param默认值为NULL,即便调用方式正确,WHERE "column_name" = param的条件永远为假,不会删除任何数据。

修正后的函数代码:

CREATE OR REPLACE FUNCTION public.fn(param TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
BEGIN
    DELETE FROM public."table_name"
    WHERE "column_name" = param;
END
$$;

内容的提问来源于stack exchange,提问作者EricBHK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:03