Массив PLPGSQL в функциях - PullRequest
       32

Массив PLPGSQL в функциях

0 голосов
/ 08 марта 2012

Как использовать массив для вставки в таблицу в функции?

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}');

Я не знаю, с чего начать создание динамической INSERT и извлечение идентификаторов из массива. Unest может использоваться для ВСТАВКИ переменных INTO в DECLARE, но динамический аспект не может быть сделан. Надеюсь, я дал это понять.

1 Ответ

2 голосов
/ 08 марта 2012

Написание функции plpgsql всегда возможно (и я делаю это много).Но этот случай можно решить проще:

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

Я заменил имя вашего столбца timestamp на ts, потому что я не думаю, что было бы хорошей идеей использовать имя типа в качестве идентификатора.Это приводит к запутанным побочным эффектам и сообщениям об ошибках.


Если , вам необходимо 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, который не в вашей модели, просто продемонстрируйте.

...