如何从plpgsql函数中作为参数接收的数组循环?

时间:2017-11-01 14:35:05

标签: arrays postgresql function loops plpgsql

我是pgplsql的新手,到目前为止,我必须创建一个循环作为函数接收的数组的函数。

该函数的主要思想是将新记录插入到一​​个表中,该表用新格式化的id映射接收到的数组中包含的每个id,格式取决于收到的第二个参数并返回表" idsTable&# 34。

问题是,当我尝试创建该函数时,它会向我发送错误:

错误:FOREACH的循环变量必须是已知变量或变量列表 第38行:在ARRAY idsList LOOP

中的FOREACH objectid

我不确定是否必须在示例中声明objectid变量因为我看到他们没有。

到目前为止,我有这个:

CREATE OR REPLACE FUNCTION createId(idsList varchar[], objectType varchar)
RETURNS TABLE(original_id varchar, new_id char) as
$$
BEGIN
IF LOWER(objectType) = 'global' THEN
    FOREACH objectid IN ARRAY idsList LOOP
        INSERT INTO idsTable(original_id, new_id)
        VALUES(objectid, 'GID'||nextval('mapSquema.globalid')::TEXT);
    END LOOP;
ELSE
    FOREACH objectid IN ARRAY idsList LOOP
        INSERT INTO idsTable(original_id, new_id)
        VALUES(objectid, 'ORG'||nextval('mapSquema.globalid')::TEXT);
    END LOOP;
END IF;
END;
$$ LANGUAGE plpgsql;

任何可能出错的想法?​​

编辑:我还没有添加返回idsTable的部分。

1 个答案:

答案 0 :(得分:0)

无关,但是:你真的不需要循环。您只需编写一次INSERT即可简化功能。你也忘了从函数中返回一些东西。因为它被声明为returns table所需:

CREATE OR REPLACE FUNCTION createid(idslist varchar[], objecttype varchar)
   RETURNS TABLE(original_id varchar, new_id varchar) as
$$
declare 
  l_prefix text;
BEGIN
  IF LOWER(objectType) = 'global' THEN
    l_prefix := 'GID';
  ELSE
    l_prefix := 'ORG';
  END IF;

  RETURN QUERY --<< return the result of the insert
  INSERT INTO idstable(original_id, new_id)
  select t.x, l_prefix||nextval('mapSquema.globalid')::TEXT
  from unnest(idslist) as t(x)
  returning *

END;
$$ LANGUAGE plpgsql;