Problème de curseurs imbriqués
Bonjour à tous, voila mon problème, je voudrais créer 2 curseurs "imbriqués" dans des boucles mais lorsque le 2nd curseur ne trouve rien dans sa requete, ca me sors pas uniquement du 2eme curseur mais aussi du 1er.
Pour éviter ca, j'ai fais un count qui vérifie si il y a des records avant de faire la boucle mais j'aimerais savoir si il y a un moyen plus "propre" de faire ca.
Je ne sais pas si c'est compréhensible, mais avec le code ca devrait aller mieux:
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 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
| FUNCTION get_value_client_grp_fonds (
client_id IN NUMBER,
grp_fonds_id IN NUMBER,
sdate IN DATE
)
RETURN NUMBER
IS
vtotal BINARY_FLOAT := 0;
vqtyfnd BINARY_FLOAT := 0;
vvaluefnd BINARY_FLOAT := 0;
vfndrate BINARY_FLOAT := 0;
vnbTrs BINARY_INTEGER := 0;
BEGIN
FOR curgrp IN (SELECT fonds_id
FROM fonds_par_groupes
WHERE groupe_fonds_id = grp_fonds_id)
LOOP
/* THIS SELECT IS NOT GOOD, IT'S TO PREVENT LOOP EXIT WHEN NO TRANSACTION FOUND.
I DON'T KNOW HOW TO DO IT PROPERLY */
SELECT COUNT(1) INTO vnbTrs
FROM transactions
WHERE no_client = client_id
AND no_fonds = curgrp.fonds_id
AND date_valeur <= DECODE (sdate, NULL, SYSDATE, sdate);
IF vnbTrs > 0 THEN
FOR rec IN (SELECT type_transaction, quant
FROM transactions
WHERE no_client = client_id
AND no_fonds = curgrp.fonds_id
AND date_valeur <= DECODE (sdate, NULL, SYSDATE, sdate))
LOOP
IF rec.type_transaction = 'S' OR rec.type_transaction = 'a'
THEN
vqtyfnd := vqtyfnd + rec.quant;
ELSIF rec.type_transaction = 'R' OR rec.type_transaction = 'r'
THEN
vqtyfnd := vqtyfnd - rec.quant;
END IF;
END LOOP;
SELECT vrate
INTO vfndrate
FROM TABLE (get_fund_rate (curgrp.fonds_id, sdate));
vvaluefnd := vqtyfnd * vfndrate;
vtotal := vtotal + vvaluefnd;
vfndrate := 0.0;
vvaluefnd := 0.0;
vqtyfnd := 0.0;
END IF;
vnbTrs := 0;
END LOOP;
RETURN vtotal;
END; |
Merci