Bonjour !
Je bute sur un problème plutôt simple en Java, mais forcément plus complexe pour moi en PL/SQL...
En entrée, j'ai par exemple 3 listes :
- 1 liste A contenant une série de lettres A à L
- 1 liste B contenant une série de lettres M à Z
- 1 liste de chiffres de 1 à 10
Je dois insérer en base chaque liste, en appliquant les règles suivantes :
- chaque élément d'une liste doit être suffixé avec "_aaa" et "_zzz" avant d'être inséré en base (ce qui double le nombre d'entrée)
- indépendamment, chaque élément d'une liste de lettres doit également être préfixé avec chaque élément de la liste de chiffres
Ce qui donnerais à insérer :
A_aaa, B_aaa, C_aaa....
A_zzz, B_zzz, C_zzz...
M_aaa, N_aaa, O_aaa...
M_zzz, N_zzz, O_zzz...
1_aaa, 2_aaa, 3_aaa...
1_zzz, 2_zzz, 3_zzz...
Puis :
1A_aaa, 1B_aaa, 1C_aaa....
1A_zzz, 1B_zzz, 1C_zzz...
2A_aaa, 2B_aaa, 2C_aaa....
2A_zzz, 2B_zzz, 2C_zzz...
etc...
Mon traitement manque peut être d’optimisation, mais j'étais parti pour faire une première boucle sur chaque liste, en ajoutant le suffixe avant l'insertion en base.
Ensuite, faire une boucle sur la liste de chiffres et, à l'intérieur, faire une seconde boucle sur chaque liste de lettres, ajoutant à chaque fois le suffixe.
Pour le moment, la 1ère boucle fonctionne de la façon suivante :
Par contre, la seconde boucle est plus problématique... Du coup, je me suis dis qu'il serait peut-être mieux de créer une liste globale, à l'intérieur de laquelle j'ajouterais mes 3 listes en entrée sans mettre de suffixe, puis la concat de mes 2 listes de lettres avec en préfixe la liste de chiffres. Enfin, je ferais une grosse boucle où j'insérerais tout avec les suffixes cette fois :
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 DECLARE type array_t IS TABLE OF VARCHAR2(14); array array_t := array_t('A', 'B', 'C', 'L'); array_chiffres array_t := array_t('1', '2', '3'); temp_id_aaa NUMBER := 60; temp_id_zzz NUMBER := 61; BEGIN --Boucle pour la liste FOR cpt IN 1 .. array.count LOOP --Insertion INSERT ALL --pour aaa INTO maTable ( ID, NOM, TYPEDONNEE ) VALUES ( temp_aaa, CONCAT(array(cpt), '_aaa'), 'toto' ) --pour zzz INTO maTable ( ID, NOM, TYPEDONNEE ) VALUES ( temp_zzz, CONCAT(array(cpt), '_zzz'), 'tutu' ) SELECT * FROM dual; temp_id_aaa := temp_id_aaa + 2; temp_id_zzz := temp_id_zzz + 2; END LOOP; --même chose pour les autres arrays END;
Mais j'ai une erreur ORA m'indiquant que je ne peux pas utiliser last_position comme index... En fait, il me faudrait donc une liste dynamique et non un array non ?!
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 DECLARE --type global type array_t IS TABLE OF VARCHAR2(20); TYPE array_liste IS TABLE OF VARCHAR2(20) INDEX BY binary_integer; last_position NUMBER := 0; BEGIN --Boucle lettres A...L FOR i IN 1 .. array_lettres.count LOOP array_liste(last_position):=array_lettres(i); last_position := last_position+1; END LOOP; --Boucle chiffres FOR i IN 1 .. array_chiffres.count LOOP array_liste(last_position):=array_chiffres(i); last_position := last_position+1; END LOOP;
Bref, je suis paumé, et après plus d'une journée complète dessus je n'y vois plus très clair...
Un peu d'aide serait la bienvenue
Merci !!!
Partager