Nested Loop et insertions multiples
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 :
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
|
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; |
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:
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; |
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 ?!
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 !!!