From 1da4c2347c20a5eef8370334e0e27a9136182bce Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 15 Jan 2026 13:06:17 +0200 Subject: [PATCH] Fix Oracle 10g compatibility in PACK_CONTAFIN SCRIE_JC_2007 procedure Replace FORALL bulk operations with FOR loops to avoid PLS-00436 error on Oracle 10.2.0.5. The older Oracle version does not support referencing record fields from collection in FORALL statements. Co-Authored-By: Claude Opus 4.5 --- oracle/roa-romconstruct/PACK_CONTAFIN.pck | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/oracle/roa-romconstruct/PACK_CONTAFIN.pck b/oracle/roa-romconstruct/PACK_CONTAFIN.pck index b068300..44753a9 100644 --- a/oracle/roa-romconstruct/PACK_CONTAFIN.pck +++ b/oracle/roa-romconstruct/PACK_CONTAFIN.pck @@ -5662,8 +5662,8 @@ CREATE OR REPLACE PACKAGE BODY "PACK_CONTAFIN" is RETURN; END IF; - -- BULK UPDATE all rows at once using FORALL - FORALL i IN 1 .. S.COUNT + -- UPDATE all rows using FOR loop (Oracle 10g compatible) + FOR i IN 1 .. S.COUNT LOOP UPDATE JC2007 J SET J.TOTCTVA = J.TOTCTVA + (CASE WHEN EXTRACT(MONTH FROM J.DATAACT) = J.LUNA AND @@ -5906,9 +5906,8 @@ CREATE OR REPLACE PACKAGE BODY "PACK_CONTAFIN" is AND J.ID_FACT = S(i).ID_FACT AND NVL(J.ID_SUCURSALA, -99) = NVL(S(i).ID_SUCURSALA, -99); - -- Populate SI and SD collections for INSERT and DELETE - FOR i IN 1 .. S.COUNT LOOP - IF SQL%BULK_ROWCOUNT(i) = 0 THEN + -- Check result of UPDATE and populate SI/SD collections + IF SQL%ROWCOUNT = 0 THEN -- No row was updated -> need to INSERT SI.EXTEND; SI(SI.COUNT) := S(i); @@ -5919,9 +5918,9 @@ CREATE OR REPLACE PACKAGE BODY "PACK_CONTAFIN" is END IF; END LOOP; - -- BULK INSERT for new rows + -- INSERT for new rows (Oracle 10g compatible) IF SI.COUNT > 0 THEN - FORALL i IN 1 .. SI.COUNT + FOR i IN 1 .. SI.COUNT LOOP INSERT INTO JC2007 (AN, LUNA, @@ -6300,12 +6299,13 @@ CREATE OR REPLACE PACKAGE BODY "PACK_CONTAFIN" is SI(i).RORTD9, SI(i).RORTD5, SI(i).ID_SUCURSALA); + END LOOP; END IF; - -- BULK DELETE for rows where all values became 0 after UPDATE + -- DELETE for rows where all values became 0 after UPDATE (Oracle 10g compatible) -- Only executed when tnScrie = nStergere IF SD.COUNT > 0 AND tnScrie = pack_contafin.nStergere THEN - FORALL i IN 1 .. SD.COUNT + FOR i IN 1 .. SD.COUNT LOOP DELETE FROM JC2007 J WHERE J.AN = SD(i).AN AND J.LUNA = SD(i).LUNA @@ -6446,6 +6446,7 @@ CREATE OR REPLACE PACKAGE BODY "PACK_CONTAFIN" is AND J.ROTN = 0 AND J.ROTN50 = 0 AND J.ROTN100 = 0; + END LOOP; END IF; END;