2014-11-18 5 views
3

Я хочу сохранить значения RETURNING для обновления в структуру данных, чтобы я мог использовать ее в последующем запросе.PostgreSQL - RETURNING INTO array

В этом примере мне предоставляется список «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 
+0

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

ответ

5

Существует несколько способов решить эту проблему. Скажем, вы хотите называть 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 
$$ 
1

Ниже приведен пример:

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; 
Смежные вопросы