Вы сбрасываете счетчик PP
после цикла d_rec
внутри цикла v_rec
; это означает, что как только он был увеличен до 4 для первых d_rec
для юнита, последующие d_rec
итерации пропускают самый внутренний цикл - потому что PP <= 4
никогда не выполняется для них.
Быстрое решение - переместить этот сброс в цикл:
...
END LOOP;
-- reset PP after this loop
PP :=1;
END LOOP;
-- instead of after this loop
--PP :=1;
END LOOP;
END
Но, вероятно, будет понятно, если вы сбросите настройки непосредственно перед использованием:
...
INSERT INTO AAA (ID, SEQ) VALUES (ID, GROUP_SEQ);
-- reset here
PP := 1;
WHILE PP <= 4
LOOP
PP := PP +1;
...
IF (PP < 3) THEN
DEBET := TRANS_SUM;
CREDIT := 0;
ELSE
DEBET := 0;
CREDIT := TRANS_SUM;
END IF;
INSERT INTO BBB(ID, SEQ, UNIT, DEBET, CREDIT) VALUES (ID, TRANS_SEQ, UNIT, DEBET, CREDIT);
COMMIT;
END LOOP;
END LOOP;
END LOOP;
END
Или вообще избавиться от явной переменной - чтобы ее не нужно было объявлять, сбрасывать или увеличивать - и вместо нее использовать a для цикла :
...
INSERT INTO AAA (ID, SEQ) VALUES (ID, GROUP_SEQ);
FOR PP IN 1..4
LOOP
...
IF (PP < 3) THEN
DEBET := TRANS_SUM;
CREDIT := 0;
ELSE
DEBET := 0;
CREDIT := TRANS_SUM;
END IF;
INSERT INTO BBB(ID, SEQ, UNIT, DEBET, CREDIT) VALUES (ID, TRANS_SEQ, UNIT, DEBET, CREDIT);
COMMIT;
END LOOP;
END LOOP;
END LOOP;
END
Кстати, все эти коммиты выглядят неправильно - они делают невозможным перезапуск при сбое, но также оказывают негативное влияние на производительность. И вы могли бы упростить это до меньшего количества циклов.