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

Oracle Discussion :

[9i][pl/sql] Dedoublonage d une collection


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut [9i][pl/sql] Dedoublonage d une collection
    Bonjour,

    Je suis dans un pl/sql et j arrive a construire une collection de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TYPE typ_table IS TABLE OF VARCHAR2(30) ;
    Tabrep typ_table := typ_table() ;
    Par contre, les valeurs de la collection Tabrep(i) peuvent etre en doublon et sont totalement desordonnées.

    J essai de trouver un moyen de les dedoublonner (et en option de les classer par lettre alphabetique), mais je bloque !!

    Y a t il un moyen simple ? Qun a t il deja été confronté à ca et peut t il m aider sur l algorithme ?

    Merci par avance

  2. #2
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Bonjour,

    Comment remplis-tu ta collection ?

    Parce que si cette collection doit être remplie au moyen d'une requête SQL, rien ne vaut le BULK COLLECT.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct monChamp bulk collect into Tabrep from maTable where .... order by 1 ;
    Comme tu peux le voir, le DISTINCT élimine les doublons, et l'ORDER BY permet le tri.

  3. #3
    Membre averti
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    Vi mais le probleme c est que je remplis ma collection par plusieurs requetes sql, donc j elimine deja les doublons pour chaque requete mais dans la collection, il se retrouve des doublons.

    Par exemple, ma 1ere requete ramene les valeur a, b, c, d
    la 2ieme a, b, e, f

    Et du coup je me retrouve avec a, b en doublon

  4. #4
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Moi je vois 4 solutions à ton pb :

    1 ) peux-tu remplir ta collection par une seule requête, en faisant un union (qui élimine les doublons au passage) sur toutes tes requêtes ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select monChamp bulk collect into Tabrep from
    (select ... from table1 ...
     union
     select ... from table2 ...
     union
     ....
     union
     select ... from tableN ...)
    order by 1 ;

    2 ) Tu gères tout toi même, mais c'est fastidieux. Même si il est à peu près facile de vérifier si la données n'existe pas dans la collection avant de l'insérer, il est plus difficile d'organiser le tri.

    3 ) tu laisses tomber la collection PL/SQL, au profit d'une table temporaire.


    Personnellement, si tu ne peux pas adopter la solution en 1, j'utiliserais la 3. Tu peuples ta table temporaire de la même manière que tu initialises ta collection, et lors de la lecture, tu fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct champ from table_temporaire order by 1 ;
    Je ne vois pas d'autres solutions.

  5. #5
    Membre averti
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    Effectivement le 1 m est impossible car je fais des requette dynamiques assez complexes.

    Donc je vais me rabattre sur la solution 3, effectivement ca me parait pas trop difficile a mettre en place, malgres le fait que j aurais preferé me passer de la creation d une table et travailler sur la collection.

    Merci bien

  6. #6
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Citation Envoyé par MorganeD
    malgres le fait que j aurais preferé me passer de la creation d une table
    Ce n'est pas une table classique à créer, mais une table temporaire, du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE GLOBAL TEMPORARY TABLE TMP_GARANTIE_CREDIT
    (
      ID_CREDIT          NUMBER(6)                  NOT NULL,
      OLD_CRE_ID_CREDIT  NUMBER(6),
      NEW_CRE_ID_CREDIT  NUMBER(6)
    )
    ON COMMIT DELETE ROWS ;
    Tu as déjà manipulé ce genre de table ?

    Si non, ce n'est pas sorcier. Tout ce que tu as à savoir, c'est que les données sont globales à ta session (les autres utilisateurs ne voient pas tes données), et ensuite tu dois te demander si tu veux que tes données soient persistentes pendant soit la durée de ta transaction (on commit delete rows), soit pendant la durée de ta session (on commit preserve rows).

  7. #7
    thg
    thg est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 46
    Par défaut
    peux tu tester ceci .. ca fonctionne en 10g pas sur que ca marche en 9i ..

    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
    create or replace procedure maproc is
     
    Type myTable is table of varchar2(30);
     
    myTab myTable := myTable();
     
    sansdoublon myTable :=  myTable();
     
    begin
     
    myTab := myTable('AAAAA' , 'BBBBB', 'AAAAA', 'AAAAA');
     
    sansdoublon := myTab MULTISET UNION DISTINCT myTab;
     
    FOR i IN sansdoublon.first .. sansdoublon.last LOOP
     
    DBMS_OUTPUT.PUT_LINE('res = ' || sansdoublon(i));
     
    END LOOP;
     
     
    end;
     
    /
    show error;
    [jaouad]Ajout de balises code

  8. #8
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Merci thg pour ce code.

    Pour info, il ne fonctionne pas en 9i. Voici l'erreur obtenue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Warning: Procedure created with compilation errors.
     
    > show err
    Errors for PROCEDURE MAPROC:
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    13/22    PLS-00103: Encountered the symbol "MULTISET" when expecting one
             of the following:
             . ( * @ % & = - + ; < / > at in is mod not rem
             <an exponent (**)> <> or != or ~= >= <= <> and or like
             between ||
    Par contre, tu me fais penser qu'il va falloir un jour que je regarde les nouveautés du PL/SQL apportées par la 10g. On arrête pas le progrés...

  9. #9
    Membre averti
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    Vi effectivement, je n arrive pas à la faire marcher sur la 9i.

    J ai donc utilisé les tables temporaires et ca marche

    Merci à vous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/06/2009, 09h14
  2. Réponses: 15
    Dernier message: 27/08/2007, 15h42
  3. Réponses: 6
    Dernier message: 24/03/2006, 09h22
  4. Réponses: 1
    Dernier message: 17/03/2006, 07h21
  5. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56

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