2015-12-17 3 views
0

Я пытаюсь создать функцию PostgreSQL, которая обновит список строк. Поэтому я хочу взять список текста [] в качестве аргумента и использовать предложение IN для выполнения запроса. Кроме того, я хочу, чтобы количество строк обновлялось как возвращаемое значение. Это работает для меня:Выполнение запроса на обновление с предложением IN в функции postgres

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

Вам необходимо использовать оператор 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' является строковой константой.

+0

Спасибо! это сработало. – doctore

Смежные вопросы