函数中的PLPGSQL数组

时间:2012-03-08 16:58:46

标签: arrays function postgresql plpgsql

如何使用数组插入函数中的表?

CREATE TABLE places
(
id      SERIAL PRIMARY KEY
,location   VARCHAR(100) NOT NULL
,timestamp  TIMESTAMP
,person_id  INTEGER NOT NULL REFERENCES people ON UPDATE...
);

CREATE TABLE people
(
id      SERIAL PRIMARY KEY
,name   VARCHAR(100) NOT NULL
);

我正在尝试做一个我会做的功能:

SELECT function(location_name, now(), '{1,2,3}');

这会将3个记录插入到数组中每个person_id的places表中,并具有相同的位置和时间戳。主要问题是数组的长度可以是动态的,因此函数应该能够处理:

SELECT function(location_name, now(), '{3,5,7,8,10}');

我不知道从哪里开始使INSERT动态化并从数组中提取id。 Unest可用于在DECLARE中插入INTO变量,但动态方面无法完成。我希望我明白这一点。

1 个答案:

答案 0 :(得分:2)

写一个plpgsql函数总是有可能的(我做了很多)。但这种情况可以更简单地解决:

INSERT INTO places (location, ts, person_id) 
SELECT 'some_location', now(), unnest('{1,2,3}'::int4[])

我将您的列名timestamp替换为ts,因为我不认为使用类型名称作为标识符是个好主意。它会导致令人困惑的副作用和错误信息。


如果,您需要JOINunnest()函数的结果集 - 就像您的问题似乎暗示(但问题变得更简单) - 你必须使它成为子查询:

INSERT INTO places (location, ts, name)
SELECT 'some_location', now(), p.name
FROM  (SELECT unnest('{1,2,3}'::int4[]) AS id) AS x
JOIN   people p USING (id);

我在模型中添加了name not ,只是做了演示。