【问题标题】:PostgreSQL - RETURNING INTO arrayPostgreSQL - 返回数组
【发布时间】:2014-11-18 21:42:13
【问题描述】:

我想将更新的返回值存储到数据结构中,以便在后续查询中使用它。

在这个例子中,我得到了一个“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

【问题讨论】:

  • 这真的取决于你想用收集的 ID 做什么。通常,具有数据修改 CTE 的单个查询是最佳解决方案。

标签: function postgresql plpgsql sql-returning


【解决方案1】:

有几种方法可以解决这个问题。

假设您想为受UPDATE 影响的每个id 调用一些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_ids,你可以简单地:

$$
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
$$

【讨论】:

    【解决方案2】:

    这是一个例子:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2015-10-30
      相关资源
      最近更新 更多