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 :

Algo de fusion de tableaux


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Par défaut Algo de fusion de tableaux
    Bonjour,
    novice dans la programmation procédurale pl/sql, j'essaie de m'exercer depuis peu mais je reste bloqué depuis plusieurs jours sur mon tout premier programme que voici :
    Nom : FUSION.PNG
Affichages : 1227
Taille : 30,1 Ko

    On me d'écrire le bloc PL/SQL qui programme la fusion de deux tableaux (déjà triés par ordre croissant) en un seul (utiliser des structures WHILE…).
    Je vous prie de bien vouloir m'aider à le réaliser.
    merci

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Dans quel ordre se fait la fusion?
    Le tableau final n'est pas trié ou alors je ne sais pas comment; pourquoi on doit avoir Alitalia après Aeris et avant Air France?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Par défaut
    oui le tableau final doit être trié

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    OK, je comprends que le tableau final doit être trié mais trié selon quel critère? Critère alphabétique? Les noms en majuscules avant les minuscules? Tri selon l'ordre binaire ou de langue?

    Si c'est un critère alphabétique, ALITALIA devrait être après Air France.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Par défaut
    le tableau doit être trié de façon alphabétique...la casse n'a pas vraiment d'importance

  6. #6
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Dans ce cas là, dans l'image, TAB_RESULTAT est faux; Alitalia doit être juste avant Quantas.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Par défaut
    Après plusieurs recherches, j'ai pu trouver la solution que voici :
    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
    SET SERVEROUTPUT ON
    DECLARE
    TYPE nomComp_tytab IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
    -- tableaux
      tab_compFrance nomComp_tytab;
      tab_compMonde nomComp_tytab;
      tab_résultat nomComp_tytab;
      v_indiceFrance NUMBER(1) := 1;
      v_indiceMonde NUMBER(1) := 1;
      v_indiceRésultat NUMBER(2) := 1;
    BEGIN
      tab_compFrance(1) := 'AERIS';
      tab_compFrance(2) := 'Air France';
      tab_compFrance(3) := 'Air Littoral';
      tab_compFrance(4) := 'Regional';
      tab_compMonde(1) := 'ALITALIA';
      tab_compMonde(2) := 'Quantas';
      tab_compMonde(3) := 'SABENA';
      tab_compMonde(3) := 'SABENA';
    -- parcours des deux tableaux en parallèle (stop à la fin d’un des 2)
      WHILE (tab_compFrance.EXISTS(v_indiceFrance) AND tab_compMonde.EXISTS(v_indiceMonde)) LOOP
        IF tab_compFrance(v_indiceFrance) > tab_compMonde(v_indiceMonde)THEN
          tab_résultat(v_indiceRésultat) := tab_compMonde(v_indiceMonde);
          v_indiceMonde := v_indiceMonde + 1;
        ELSE
          tab_résultat(v_indiceRésultat) := tab_compFrance(v_indiceFrance);
          v_indiceFrance := v_indiceFrance + 1;
        END IF;
          v_indiceRésultat := v_indiceRésultat + 1;
      END LOOP;
    -- Traitement de la fin du tableau qui reste à parcourir
      WHILE (tab_compFrance.EXISTS(v_indiceFrance)) LOOP
        tab_résultat(v_indiceRésultat) := tab_compFrance(v_indiceFrance);
        v_indiceRésultat := v_indiceRésultat + 1;
        v_indiceFrance := v_indiceFrance + 1;
      END LOOP;
      WHILE (tab_compMonde.EXISTS(v_indiceMonde)) LOOP
        tab_résultat(v_indiceRésultat) := tab_compMonde(v_indiceMonde);
        v_indiceRésultat := v_indiceRésultat + 1;
        v_indiceMonde := v_indiceMonde + 1;
      END LOOP;
    -- Affichage des résultats
      DBMS_OUTPUT.PUT_LINE('Nombre éléments de tab_résultat ' || tab_résultat.COUNT);
      FOR v_entier IN 1 ..tab_résultat.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE('tab_résultat(' || v_entier || ') : ' || tab_résultat(v_entier));
      END LOOP;
    END;

  8. #8
    Expert confirmé 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
    Par défaut
    Utilisez des collections et opérateurs ensembliste des collections et laissez le moteur SQL faire le tri
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> CREATE OR REPLACE Type varchar2_tt As Table Of Varchar2(30)
      2  /
    Type created
     
    SQL> alter session set NLS_SORT = Binary
      2  /
    Session altered
     
    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2  -- tableaux
      3    tab_compFrance varchar2_tt := varchar2_tt('AERIS', 'Air France', 'Air Littoral', 'Regional');
      4    tab_compMonde  varchar2_tt := varchar2_tt('ALITALIA', 'Quantas', 'SABENA', 'SABENA');
      5    tab_resultat   varchar2_tt;
      6  BEGIN
      7    tab_resultat := tab_compFrance Multiset Union Distinct tab_compMonde;
      8    --
      9    select cast ( multiset( select *
     10                            from table( tab_resultat)
     11                            order by 1
     12                           ) as varchar2_tt)
     13     into tab_resultat
     14     from dual;
     15    --
     16    FOR v_entier IN 1 ..tab_resultat.COUNT LOOP
     17      DBMS_OUTPUT.PUT_LINE('tab_résultat(' || v_entier || ') : ' || tab_resultat(v_entier));
     18    END LOOP;
     19  End;
     20  /
    tab_résultat(1) : AERIS
    tab_résultat(2) : ALITALIA
    tab_résultat(3) : Air France
    tab_résultat(4) : Air Littoral
    tab_résultat(5) : Quantas
    tab_résultat(6) : Regional
    tab_résultat(7) : SABENA
    PL/SQL procedure successfully completed
     
    SQL>

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

Discussions similaires

  1. Fusion des tableaux algorithme
    Par KnightofEmpire dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 22/11/2008, 12h39
  2. [Tableaux] Fusion de tableaux et array_merge
    Par wikipierre dans le forum Langage
    Réponses: 3
    Dernier message: 25/01/2008, 08h10
  3. Fusion de tableaux de points
    Par harry_kalagan dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/05/2007, 15h36
  4. [Tableaux] Fusion de tableaux associatifs
    Par laloupiote dans le forum Langage
    Réponses: 7
    Dernier message: 24/04/2007, 15h37

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