2012-03-08 18 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}'); 

これは、同じ場所とタイムスタンプと、アレイ内の各PERSON_IDのための場所のテーブルに3つのレコードを挿入します。主な問題は、関数が処理することができる必要がありますので、配列の長さは、ダイナミックにできることである:配列からIDをINSERTは、動的な作りと抽出に開始する場所を

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

私は知りません。 UnestはDECLAREのINSERT INTO変数に使用できますが、動的なアスペクトは実行できません。私はこれを明確にしたいと思う。

答えて

2

plpgsql関数を書くことは、常に可能性があります(私はそれをたくさん行います)。しかし、この場合は単純に解決することができます。

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

私は識別子としてタイプ名を使用するのは良いアイデアだとは思わないので、私はtsを使用して列名timestampを置き換えます。混乱した副作用やエラーメッセージが表示されます。


場合はunnest()機能の結果セットにJOINに必要 - あなたの質問を暗示しているようだ(しかし、問題は単純であることが判明)のように - あなたはそれをサブクエリを行う必要があります。

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

+0

plpgsql関数または 'DO'ステートメント内で、yesを指定します。いいえ、どのような副作用が起こる可能性があります。新しい[FOREACH'ループ](http://www.postgresql.org/docs/current/interactive/plpgsql-control-structures.html#PLPGSQL-Foreach-ARRAY)に興味があるかもしれません。 –