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:
Merci
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;
Partager