我有这个功能:
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
在另一张表中保存记录。
如何“中断”此查询以便我可以同时执行“插入”和“更新”?
答案 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;