代码之家  ›  专栏  ›  技术社区  ›  Somil

如何从postgres函数返回新创建的ids数组?

  •  1
  • Somil  · 技术社区  · 7 年前

    我正在使用postgres函数在一个表中插入多行。 我必须返回插入行的所有ID。

    我的职能如下

        CREATE OR REPLACE FUNCTION insert_multiple_rows(temp integer)
            RETURNS integer[]
            LANGUAGE 'plpgsql'
            VOLATILE
            PARALLEL UNSAFE
            COST 100
        AS $BODY$DECLARE
        company_ids_list integer[];
        BEGIN
        INSERT INTO company VALUES
        (default,now(),temp),
        (default,now(),temp),
        (default,now(),temp),
        (default,now(),temp)
         RETURNING id INTO company_ids_list;
    
        RETURN company_ids_list;
        END;
        $BODY$;
    

    当我试图用

     select insert_multiple_rows(58);
    

    获取错误

    ERROR:  query returned more than one row
    CONTEXT:  PL/pgSQL function create_company_budget_allocation(integer) 
    line 4 at SQL statement
    SQL state: P0003
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Laurenz Albe    7 年前

    SELECT .. INTO INSERT ... RETURNING ... INTO 只能填充单个变量。如果查询返回多行,您将得到观察到的错误。

    您可以使用 INSERT CTE和使用中的语句 array_agg 要构造结果数组,请执行以下操作:

    WITH ins AS (
       INSERT INTO company VALUES
          (default,now(),temp),
          (default,now(),temp),
          (default,now(),temp),
          (default,now(),temp)
       RETURNING id)
    SELECT array_agg(id) INTO company_ids_list
    FROM ins;