У меня есть две таблицы, как показано ниже.
TABLE 1 TABLE 2
-------- --------
id id
date table1_id
total subtotal
balance
table 1 table 2
-------- ---------
id total balance id table1_id subtotal paid
1 20 10 1 1 5 5
2 30 30 2 1 15 5
3 2 10 0
4 2 10 0
5 2 10 0
Мне нужно добавить столбец оплаченный в Таблица 2. так что кто-нибудь может помочь мне добавить значения в недавно добавленный столбец для существующих данных. Я попытался написать процедуру, как показано ниже, но поскольку postgres не позволяет, если в цикле for, я не могу это сделать.
CREATE OR REPLACE FUNCTION public.add_amountreceived_inbillitem() RETURNS void AS
$BODY$
DECLARE
rec RECORD;
inner_rec RECORD;
distributebalance numeric;
tempvar numeric;
BEGIN
FOR rec IN select * from table1
LOOP
distributebalance = rec.balance;
FOR inner_rec IN(select * from table2 where table1_id = rec.id order by id limit 1)
tempvar = distributebalance - inner_rec.subtotal;
if (distributebalance >0 and tempvar>=0) THEN
update table2 set paid = inner_rec.subtotal where id = inner_rec.id ;
distributebalance =distributebalance-inner_rec.subtotal;
else if ( distributebalance >0 and tempvar<0 )THEN
update table2 set paid = distributebalance where id = inner_rec.id;
END IF;
END LOOP;
END LOOP;
END; $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Заранее спасибо :)





Postgres допускает использование операторов IF в циклах.
Проблема в том, что, написав ELSE IF, вы начали новый оператор IF, поэтому теперь у вас есть 2 открывающих IF, но только один закрывающий END IF. «Правильным» elseif в plpgsql является ELSIF или ELSEIF. Так что просто удалите пробел между этими словами, и все должно сработать.