Problème utilisation de deux curseurs et boucle FOR
Bonjour,
Je suis sur Oracle 10G avec Oracle SQL Developer 1.5.1
Je souhaite réaliser un UPDATE sur une colonne d'une table lorsque certaines conditions sont réunies. Ces conditions sont le résultat d'une requête sur d'autres tables.
Pour ce faire, 2 curseurs sont mis en place. l'un qui fait un SELECT dans la table dans laquelle l'UPDATE doit se faire. L'UPDATE à "YES" a lieu si le 1er curseur ramène une ligne qui satisfait les condition du deuxième Curseur. Si non, pour cette même ligne, l'UPDATE doit se faire à "NO".
Seulement, la boucle tourne dans le vide pendant longtemps. Donc il y a un problème que je n'arrive pas à résoudre.
D'où cette présente demande.
Code:
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
| DECLARE
-- Déclaration Curseurs
CURSOR Cur_1 IS
SELECT NUMV,
NUMP,
NUMC
FROM CONT WHERE NUMV IN (A,B,C);
rec_1 Cur_1%ROWTYPE;
CURSOR Cur_2 (NV CONT.NUMV%TYPE, NP CONT.NUMP%TYPE, NC CONT.NUMC%TYPE) IS
select
c.NUMV,
c.NUMP,
c.NUMC,
c.livres
from cont c,
version v,
pers p,
isef f
where
c.NUMV in (81,85,90) and
c.NUMV = NV and
v.NUMV = NV and
p.NUMV = NV and
p.pers = NP and
c.sef = f.sef and
c.actif= 'O' and
f.fct <> 'AG' and
f.fct <> 'PG' and
f.fcti <> 'OP' and
--- and
....;
rec_2 Cur_2%ROWTYPE;
BEGIN
FOR rec_1 IN Cur_1 LOOP
FOR rec_2 IN Cur_2(rec_1.NUMV,rec_1.NUMP,rec_1.NUMC)
LOOP
UPDATE CONT SET LIVRES = 'Y'
WHERE NUMV = rec_1.NUMV AND
NUMP = rec_1.NUMP AND
NUMC = rec_1.NUMC;
IF Cur_2%NOTFOUND
THEN
UPDATE CONT SET LIVRES = 'N';
END IF;
END LOOP;
END LOOP;
COMMIT
END; |
Merci pour votre aide.
Problème utilisation de deux curseurs et boucle FOR
Avant tout, merci pour votre réponse.
Simplement, entre temps, c'est ce que j'ai tenté de faire et cela tourne toujours dans le vide.
J'ai reposé le code ainsi :
Code:
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
| Declare
CURSOR Cur_1 IS
select
c.NUMV,
c.NUMP,
c.NUMC,
c.livres
from cont c, version v,pers p, isef f
where
c.NUMV in (81,85,90) and
v.NUMV = p.NUMV and
c.NUMV = p.NUMV and
p.pers = c.NUMP and
c.sef = f.sef and
c.actif= 'O' and
f.fct <> 'AG' and
f.fct <> 'PG' and
f.fcti <> 'OP' and
--- and
....;
rec_1 Cur_1%ROWTYPE;
BEGIN
FOR rec_1 IN Cur_1 LOOP
IF Cur_1%FOUND THEN
UPDATE CONT SET LIVRES = 'Y'
WHERE NUMV = rec_1.NUMV AND
NUMP = rec_1.NUMP AND
NUMC = rec_1.NUMC;
ELSE
UPDATE CONT SET LIVRES = 'N'
WHERE NUMV = rec_1.NUMV AND
NUMP = rec_1.NUMP AND
NUMC = rec_1.NUMC;
END IF;
END LOOP;
COMMIT;
END; |
Mais ça boucle encore sans arrêt.
Merci pour votre aide.
Problème utilisation de deux curseurs et boucle FOR
Si je reprends votre code, à quel moment introduire mon UPDATE ?
Après le crs%NOTFOUND ?
Citation:
Declare
Cursor crs IS
SELECT ...
rec crs%RowType;
Begin
Open crs;
Loop
Fetch crs INTO rec;
Exit When crs%NOTFOUND;
--
IF crs%Found Then
Else
End IF;
End Loop;
Close crs;
End;
Merci!
Problème utilisation de deux curseurs et boucle FOR
Alors, comment poser le code afin de réaliser mes updates ?
Problème utilisation de deux curseurs et boucle FOR
J'ai fini par modifier mon script afin de l'exécuter en plusieurs fois pour faire les UPDATE souhaités.
Pour UPDATE à 'Y':
Citation:
UPDATE CONT SET LIVRES = 'Y'
WHERE (...,
...,
...
)
IN (
SELECT c.nv,
c...,
c...
from cont c,
...
where
c.nv = 81 AND --A faire pour (81,85,90)
...
... ;
Ensuite pour UPDATE à 'N' :
Citation:
UPDATE CONT SET LIVRES = 'N' WHERE LIVRES <> 'O' AND no_version = 81
Simplement j'aurais souhaité avoir la solution en un seul traitement PL.
Merci!
Problème utilisation de deux curseurs et boucle FOR
Je teste de suite.
Merci beaucoup Bergemoth !