如何在查询中插入

时间:2015-10-26 09:17:32

标签: sql postgresql

我有这个功能:

CREATE OR REPLACE FUNCTION func1()
  RETURNS void AS
$BODY$
declare
    row record;
    row2 record;
    v_id integer[];
begin
        for row in select * from A where .... order by ...
        loop
            for row2 in update B a set quantity=quantity2 from
            (select ... from... where....) q
            where .... returning a.id
            loop
                v_id=v_id||row2.id;                     
            end loop;
       end loop;

       more operations....
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

我需要在insert hapennds之前添加update B操作。在我做quantity=quantity2之前我想用quantity在另一张表中保存记录。

如何“中断”此查询以便我可以同时执行“插入”和“更新”?

1 个答案:

答案 0 :(得分:0)

传统上它是由BEFORE或INSTEAD OF触发器完成的。

如果您不想使用触发器,只需重复查询即可。

首先执行INSERT旧值:

INSERT INTO AnotherTable (quantity)
SELECT quantity
FROM B
WHERE <filter>

然后执行UPDATE

update B
set quantity = q.quantity2 
from q
where <filter>

内部for row2循环执行包含B中更新的所有行的ID的内容。它的作用并不重要。在更新之前,使用INSERT ... SELECT将表B中的值保存到AnotherTable。我真的不明白这里的问题是什么。

    for row in select * from A where .... order by ...
    loop

        INSERT INTO AnotherTable (quantity)
        SELECT quantity
        FROM B
        WHERE <some filter>
        ;

        for row2 in update B a set quantity=quantity2 from
        (select ... from... where....) q
        where <some filter> returning a.id
        loop
            v_id=v_id||row2.id;                     
        end loop;
   end loop;