循环遍历PL / pgSQL中

时间:2017-02-15 13:45:09

标签: arrays postgresql loops plpgsql

我正在尝试遍历几个字段并对它们运行一个函数:

FOR field IN ARRAY['f1','f2'] LOOP
    execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;

这是我正在尝试使用的功能:

CREATE OR REPLACE FUNCTION pg_temp.converFieldToLower(t varchar, f varchar) RETURNS void AS $$
#variable_conflict use_variable
BEGIN
  EXECUTE concat_ws (' ', 'UPDATE',t,'SET',f,'= LOWER(',f,')');
END;
$$ LANGUAGE plpgsql;

看起来这不是声明数组的正确方法,我做错了什么?

ERROR:  syntax error at or near "ARRAY"
LINE 49:         FOR field IN ARRAY['f1','f2'] LOOP

3 个答案:

答案 0 :(得分:9)

FOREACH loop专门用于迭代数组值的元素,例如:

FOREACH field IN ARRAY ARRAY['f1','f2'] LOOP
    execute pg_temp.converFieldToLower(newTableNameRaw,field) into res;
END LOOP;

该功能是在Postgres 9.1中引入的。

答案 1 :(得分:4)

首先,EXECUTE用于动态SQL,这里没有任何动态 您可能打算使用PERFORM来放弃结果。

FOREACH用于循环,例如@klin already provided。更多细节:

或者您只需使用纯SQL,通常更简单,更快捷:

PERFORM pg_temp.converFieldToLower(newTableNameRaw, t.val)
FROM   (VALUES ('f1'), ('f2')) t(val);  -- for some given constants or variables

最佳解决方案取决于具体情况。 FOREACH处理实际数组可能是一个好主意。

对于只有两个或三个常量或变量,我会拼出来并避免任何开销。更简单,更快。

PERFORM pg_temp.converFieldToLower(newTableNameRaw, 'f1');
PERFORM pg_temp.converFieldToLower(newTableNameRaw, 'f2');

答案 2 :(得分:0)

您想要unnest数组。

FOR field IN unnest(ARRAY['f1','f2']) LOOP
    execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;