1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| /*
Incident : ETU573695 - Fusion des caisses
Objectifs :
- Table decompte_poste, mise à jour des champs DEC_MT_POSTE, DEC_MT_RESTANT
- Table decompte_poste, suppression des enregistrements des codes créance '0312xxx' ayant
le même nombre d'enregistrements sur la créance '0715xxx' correspondante
Date de création : 13/09/2012
Auteur : Vincent PARIS
Date de modification :
Nature de la modification :
*/
CREATE OR REPLACE PROCEDURE MAJ_DecomptePoste_03120715_01()
BEGIN
--Déclaration des variables
DECLARE DecCodeContrat312_C2 char(20);
DECLARE DecCodeContrat715 char(20);
DECLARE DecCodePoste char(2);
DECLARE DecTypeDecompte integer;
DECLARE DecCodeClient char(20);
DECLARE DecMtPoste double;
DECLARE DecMtRestant double;
DECLARE DecTypeTiers char(1);
DECLARE DecCodeTiers char(20);
DECLARE DecCodeContrat312 char(20);
DECLARE exitcode integer;
--Curseur 1 : liste des créances '0312xxx' ayant une créance '0715xxx' correspondante avec l'ensemble
--des codes poste, soit le même nombre d'enregistrements
DECLARE Cursor1 CURSOR FOR
select A.dec_code_contrat
from (
select dec_code_contrat, count(*) as nb_enr_312
from decompte_poste
where dec_code_contrat like '0312%'
group by dec_code_contrat
) as A,
(
select dec_code_contrat, count(*) as nb_enr_715
from decompte_poste
where dec_code_contrat like '0715%'
group by dec_code_contrat
) as B
where substr(A.dec_code_contrat,5,16) = substr(B.dec_code_contrat,5,16)
and nb_enr_312 = nb_enr_715;
--Curseur 2 : liste des données de decompte_poste pour la créance 0312 en cours lue par le curseur Cursor1
DECLARE C2 CURSOR FOR
select dec_code_contrat, dec_code_poste, dec_type_decompte, dec_code_client, dec_mt_poste, dec_mt_restant,
dec_type_tiers, dec_code_tiers
from decompte_poste
where dec_code_contrat = DecCodeContrat312;
--Handler détectant la fin de la lecture de la requête
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET exitcode = 1;
--ouverture du curseur Cursor1
OPEN Cursor1;
--parcours du curseur Cursor1
loop_over_cursor1:
LOOP
FETCH FROM Cursor1 INTO DecCodeContrat312;
--on teste si le curseur est arrivé ou non à la fin des résultats de la requête ci-dessus
IF exitcode = 1 THEN
LEAVE loop_over_cursor1; --sortie de la boucle LOOP
END IF;
--Ouverture du curseur C2
open C2;
--Parcours du curseur C2
loop_over_cursor2:
LOOP
FETCH FROM C2 INTO DecCodeContrat312_C2, DecCodePoste, DecTypeDecompte, DecCodeClient, DecMtPoste, DecMtRestant,
DecTypeTiers, DecCodeTiers;
--on teste si le curseur est arrivé ou non à la fin des résultats de la requête ci-dessus
IF exitcode = 1 THEN
LEAVE loop_over_cursor2; --sortie de la boucle LOOP
END IF;
--pour initialiser le code contrat 0715, on concatène à 0715 les derniers chiffres du code créance 0312 correspondant
SET DecCodeContrat715 = '0715'||substr(DecCodeContrat312_C2,5,16);
UPDATE decompte_poste
SET dec_mt_poste = dec_mt_poste + dec(DecMtPoste,8,2),
dec_mt_restant = dec_mt_restant + dec(DecMtRestant,8,2)
WHERE dec_code_contrat = DecCodeContrat715
AND dec_code_poste = DecCodePoste
AND dec_type_decompte = DecTypeDecompte
and dec_code_client = DecCodeClient
and dec_type_tiers = DecTypeTiers
and dec_code_tiers = DecCodeTiers;
delete from decompte_poste
where dec_code_contrat = DecCodeContrat312_C2
and dec_code_poste = DecCodePoste
and dec_type_decompte = DecTypeDecompte
and dec_code_client = DecCodeClient
and dec_type_tiers = DecTypeTiers
and dec_code_tiers = DecCodeTiers;
END LOOP loop_over_cursor2;
SET exitcode = 0;
--Fermeture curseur C2
close C2;
END LOOP loop_over_cursor1;
--Fermeture du curseur Cursor1
CLOSE Cursor1;
END |
Partager