首页 > 解决方案 > 函数中的 for 循环无效

问题描述

我正在尝试使以下功能正常工作:

CREATE OR REPLACE FUNCTION validate_count(devices TEXT[], campaign_id INTEGER) RETURNS void AS $$
  DECLARE
    devices_array TEXT[]  := devices;
    devices_count INTEGER := array_length(devices, 1);
    row_id        INTEGER := campaign_id;
  BEGIN
    FOR device IN unnest(devices_array) LOOP
      IF my_count('my_table', device, row_id) != 1;
        RAISE EXCEPTION 'invalid_count %', row_id
      ENDIF
    END LOOP;
  END
$$ LANGUAGE plpgsql;

my_count是一个返回 INTEGER 的工作函数。

定义失败并出现错误:

ERROR:  syntax error at or near "unnest"
LINE 7:           FOR device IN unnest(devices_array) LOOP

你能发现问题吗?谢谢!

我打算按如下方式调用该函数:

select validate_count('{foo, bar}', 1)

标签: postgresqlfunctionloops

解决方案


需要解决一些问题才能使其有效。

FOR循环需要在SELECT之前unnest,即:

FOR device IN SELECT unnest(devices_array) LOOP

您需要在device顶部声明,例如:

DECLARE device RECORD;

IF语句需要 aTHEN而不是 a ;,即:

IF my_count('my_table', device, row_id) != 1 THEN

RAISE EXCEPTION语句在行尾需要一个分号,即:

RAISE EXCEPTION 'invalid_count %', row_id;

ENDfor语句IF应该是.END IF;

ENDfor语句LOOP应该是.END LOOP;

这是最终结果:

CREATE OR REPLACE FUNCTION validate_count(devices TEXT[], campaign_id INTEGER) RETURNS void AS $$
  DECLARE
    devices_array TEXT[]  := devices;
    devices_count INTEGER := array_length(devices, 1);
    row_id        INTEGER := campaign_id;
    device        RECORD;
  BEGIN
    FOR device IN SELECT unnest(devices_array) LOOP
      IF my_count('my_table', device, row_id) != 1 THEN
        RAISE EXCEPTION 'invalid_count %', row_id;
      END IF;
    END LOOP;
  END
$$ LANGUAGE plpgsql;

推荐阅读