我是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的部分。
答案 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;