在postgres函数

时间:2015-12-17 12:49:41

标签: postgresql

我正在尝试创建一个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;

这就是我一直在努力做的事情。有人可以帮我解决这个问题吗?

1 个答案:

答案 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'是一个字符串常量。