我正在尝试创建一个PostgreSQL函数,它将更新行列表。所以我想将text []列表作为参数,并使用IN子句来执行查询。此外,我想将更新的行数更新为返回值。 这对我有用:
CREATE FUNCTION set_mail_isbeingused(list_of_mail_names text[]) RETURNS void AS $$
BEGIN
FOR i in 1 .. array_upper(list_of_mail_names,1)
LOOP
UPDATE mail_isbeingused set isbeingused = 'true' where mailname = list_of_mail_names[i];
END LOOP;
END;
$$
LANGUAGE plpgsql;
但我想在一个带有IN子句的更新查询中执行它。
CREATE FUNCTION set_mail_isbeingused(list_of_mail_names text[]) RETURNS void AS $$
BEGIN
UPDATE mail_isbeingused set isbeingused = 'true' where mailname in list_of_mail_names;
END;
$$
LANGUAGE plpgsql;
这就是我一直在努力做的事情。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您需要将ANY
运算符与数组一起使用。您无法使用IN
要获取更新的行数,请使用GET DIAGNOSTICS
CREATE FUNCTION set_mail_isbeingused(list_of_mail_names text[])
RETURNS integer --<< you need to change the return type
AS $$
DECLARE
l_rows integer;
BEGIN
UPDATE mail_isbeingused
set isbeingused = true
where mailname = ANY (list_of_mail_names);
GET DIAGNOSTICS l_rows = ROW_COUNT; --<< get the number of affected rows
RETURN l_rows;
END;
$$
LANGUAGE plpgsql;
布尔常量不需要放入单引号true
是一个布尔值'true'
是一个字符串常量。