PostgreSQL - ВЕРНУТЬСЯ В Массив
Я хочу сохранить значения RETURNING для обновления в структуре данных, чтобы использовать ее в следующем запросе.
В этом примере мне дан список "parent_ids", и я хочу найти всех потомков, чьи родители находятся в этом массиве. Затем я хочу обновить их и заняться другими делами.
CREATE OR REPLACE FUNCTION plpgsql_is_really_great(parent_ids bigint[])
RETURNS void AS
$$
DECLARE
found_ids bigint[];
BEGIN
UPDATE child SET
foo = bar
FROM
(SELECT id
FROM child
WHERE parent_id=ANY(parent_ids)
) as children_ids
WHERE
child.id = children_ids.id
RETURNING children_ids.id INTO found_ids; -- ???
-- do more stuff with found_ids
$$ LANGUAGE plpgsql
2 ответа
Решение
Есть несколько способов сделать это. Скажи, что хочешь позвонить f()
для каждого id
,
В PL/pgSQL:
$$
DECLARE found_id BIGINT;
BEGIN
FOR found_id IN (UPDATE child SET foo=bar RETURNING id) LOOP
PERFORM f(found_id);
END LOOP;
END
$$
В чистом SQL:
WITH updated(found_id) AS (
UPDATE child SET foo=bar RETURNING id
)
SELECT f(found_id) FROM updated;
Если вы хотите собрать все found_id
В массиве вы можете просто:
$$
DECLARE array_var BIGINT[];
BEGIN
WITH updated(found_id) AS (
UPDATE child SET foo=bar RETURNING id
)
SELECT array_agg(found_id) FROM updated INTO array_var;
END
$$
Вот пример:
CREATE OR REPLACE FUNCTION exemplary ( parent_ids bigint[] )
RETURNS VOID AS $$
DECLARE
_found_ids bigint[];
BEGIN
WITH matching_children AS (
UPDATE child
SET foo = 1
WHERE parent_id = ANY ( parent_ids )
RETURNING id
)
SELECT array_agg ( id )
FROM matching_children
INTO _found_ids;
RAISE NOTICE '%', _found_ids;
RETURN;
END $$ LANGUAGE plpgsql;