Я согласен с clyc, вам нужно думать в наборах.Если нам не хватает подробностей, эта операция не нуждается в процедурном коде.
Пример данных:
create table income_master (
income_id number(10),
income_type varchar2(10),
income_date date
);
create table income_details (
income_details_seq_no number(10),
income_id number(10),
item_id number(10),
item_value number(10,2)
);
insert into income_master values (1,'a',sysdate);
insert into income_master values (2,'b',sysdate);
insert into income_master values (3,'c',sysdate);
insert into income_master values (4,'d',sysdate);
insert into income_details values(1,1,201,1);
insert into income_details values(2,1,202,20);
insert into income_details values(3,1,203,300);
insert into income_details values(4,1,204,4000);
insert into income_details values(5,2,201,1);
insert into income_details values(6,2,202,20);
insert into income_details values(7,2,203,300);
insert into income_details values(8,3,201,10);
insert into income_details values(9,3,202,20);
insert into income_details values(10,3,203,30);
insert into income_details values(11,4,202,-90);
insert into income_details values(12,4,202,-10);
Вставить оператор:
INSERT INTO Income_Details (Income_Id, Item_Id, Item_Value)
(
SELECT ma.Income_Id, 205, SUM(DECODE(de.Item_ID,201,-1,1) * de.Item_Value)
FROM Income_Master ma
JOIN Income_Details de ON ma.Income_Id = de.Income_Id
AND de.Item_Id BETWEEN 201 and 204
GROUP BY ma.Income_Id, 205
);
Результаты:
select Income_Id, Item_Id, Item_Value from income_details WHERE Item_Id = 205;
INCOME_ID ITEM_ID ITEM_VALUE
---------------------- ---------------------- ----------------------
3 205 40
1 205 4319
2 205 319
4 205 -100