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 : Sélectionner tout - Visualiser dans une fenêtre à part
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