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
相关产品推荐
相关产品推荐

