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;
Другие вопросы по тегам