IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Nested Loop et insertions multiples [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut 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 : 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;
    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
     
    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 !!!
    Très apprenti programmeur

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Le plus simple est d'employer le SQL pour générer vos données
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> 
    SQL> With Data As (
      2  Select column_value val
      3    from table (sys.odcivarchar2list('A', 'B', 'C', 'L'))
      4  ),
      5  Suffix As (
      6  Select column_value suf
      7    from table (sys.odcivarchar2list('aaa', 'zzz'))
      8  ),
      9  NumList As (Select column_value numval
     10    from table (sys.odcinumberlist(1, 2, 3))
     11  )
     12  Select numval||val||'_'||suf
     13    from Data
     14         cross join
     15         Suffix
     16         cross join
     17         NumList
     18  /
    NUMVAL||VAL||'_'||SUF
    --------------------------------------------------------------------------------
    1A_aaa
    2A_aaa
    3A_aaa
    1A_zzz
    2A_zzz
    3A_zzz
    1B_aaa
    2B_aaa
    3B_aaa
    1B_zzz
    2B_zzz
    3B_zzz
    1C_aaa
    2C_aaa
    3C_aaa
    1C_zzz
    2C_zzz
    3C_zzz
    1L_aaa
    2L_aaa
    NUMVAL||VAL||'_'||SUF
    --------------------------------------------------------------------------------
    3L_aaa
    1L_zzz
    2L_zzz
    3L_zzz
    24 rows selected
     
    SQL>

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Mais j'ignorais que l'on pouvait faire aussi simple !

    Merci
    Très apprenti programmeur

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je bute sur un problème plutôt simple en Java, mais forcément plus complexe pour moi en PL/SQL...
    Mais j'ignorais que l'on pouvait faire aussi simple !
    Sans vouloir vous offenser (c'est plus pour aider )!

    Votre pensée est orientée programmation Java, c'est à dire entité/objet, traitement objet par objet. Mais, dans le monde des bases des données, vous avez besoin d'une pensée orientée ensemble (set mind oriented). Il suffit juste de s'entrainer un peu puis, cela va de soi (j'ai passé moi même par cette étape).

  5. #5
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Je ne suis point offensé : toutes les critiques, pour peut qu'elles soient constructives, sont bonnes à prendre

    Mes attributions ont récemment changées, et je me retrouve à faire plus de PL/SQL, ou de SQL simple, que de Java. Alors, effectivement, cela demande une certaine gymnastique d'esprit.
    Heureux de voir que l'on peut surmonter cette phase à ce point
    Très apprenti programmeur

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Très bien alors!

    Les conseils dans ce cas sont:
    • essayer de faire le plus possible en SQL
    • quand le SQL ne suffit plus employez le PL/SQL
    • en PL/SQL privilégiez les collections
    • le code PL/SQL dédié à la production doit être obligatoirement instrumentalisé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant][code] insert multiple de valeurs
    Par topaze dans le forum Oracle
    Réponses: 9
    Dernier message: 29/11/2005, 15h22
  2. procédure stockée insert multiple
    Par gigi34 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2005, 10h37
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. INSERT multiples avec : rs.AddNew et .Update
    Par M.Zip dans le forum ASP
    Réponses: 4
    Dernier message: 03/12/2004, 15h53
  5. pb d'insertions multiples
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 14/07/2004, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo