2015-10-26 66 views
0

中間我有這樣的功能:如何做插入查詢

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操作update B hapennds了。在我做這件事之前,我已經準備好了quantity=quantity2我想用quantity在另一個表中保存記錄。

如何「中斷」此查詢,以便我可以同時插入和更新?

+1

你可以創建一個觸發器來執行(_insert into another_table_),同時更新表「B」。從哪裏'quantity2'來自你的函數? –

+0

我不能,已經考慮過......這會導致很多問題(因爲我無法控制順序觸發器執行)。我需要在「更多操作....」代碼開始之前準備好其他表格。 – SMW

+0

您是否在尋找類似的東西-http://hastebin.com/wecocetepe.rb? –

回答

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更新了所有的行標識的東西。它沒有關係。在更新之前,使用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; 
+0

這將給插入'數量2'的值是新值...我需要舊值...在更新之前。 – SMW

+0

這個想法是,在'WHERE'中使用相同的過濾器''UPDATE''來改變之前,''從'B'中選擇'表'中的值。 –

+0

但循環在哪裏?我不明白我是如何將它與上述功能相關聯的。 – SMW