2012-03-08 75 views
0

如何在函數中使用數組插入到表中?函數中的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,具有相同的位置和時間戳。主要的問題是,數組的長度可以是動態的,所以功能應該能夠處理:

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

我不知道在哪裏可以從陣列使得插入動態和提取的ID開始。 Unest可以用於DECLARE中的​​INSERT INTO變量,但動態方面無法完成。我希望我明確這一點。

回答

2

寫一個plpgsql函數總是有可能的(我也做了很多)。但是,這種情況下是可以解決的簡單:

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

ts更換您的列名timestamp,因爲我不認爲這是使用類型名稱作爲識別一個好主意。它會導致混淆副作用和錯誤信息。


如果需要JOIN到結果集的unnest()功能 - 比如你的問題似乎暗示(但問題竟然是簡單的) - 你必須使它成爲一個子查詢:

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,這是在你的模型,只是演示。

+0

感謝您的回答,我可以做,我在陣列LOOP而不是? LOOP有任何副作用嗎? – Neeran 2012-03-09 09:28:03

+0

在plpgsql函數或'DO'語句中,是的。不知道,可能會產生什麼副作用。您可能對新的['FOREACH'循環]感興趣(http://www.postgresql.org/docs/current/interactive/plpgsql-control-structures.html#PLPGSQL-FOREACH- ARRAY) – 2012-03-09 09:51:43