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

SQL Oracle Discussion :

Optimiser 2 boucles FOR ?


Sujet :

SQL Oracle

  1. #1
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Optimiser 2 boucles FOR ?
    Hello tlm

    J'ai 2 tables :

    TABLE libelle
    lib VARCHAR2

    lib
    'COMP%'

    TABLE entreprise
    id_ent NUMBER
    nom VARCHAR


    id_ent | nom
    01 | 'COMPAGNIE INFORMATIQUE'
    02 | 'TOTO INC'


    Je veux rechercher les lignes de la table Entreprise qui correspondent à chaque libelle.

    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
    DECLARE
    CURSOR libcur is select * from libelle;
    label libcur%ROWTYPE;
    CURSOR entcur is SELECT id_ent, nom FROM entreprise;
    ent entcur%ROWTYPE;
    BEGIN
      FOR label IN libcur
      LOOP
        FOR ent IN ptcur
        LOOP
        IF (ent.full_name LIKE label.lib) THEN
          DBMS_OUTPUT.PUT_LINE(ent.id_ent || ' - ' || ent.full_name || ' - ' ||label.lib);
        END IF;
        END LOOP;
      END LOOP;
    END;
    /
    Pour le moment j'ai laissé l'affichage avec DBMS_OUTPUT mais j'ai vite le buffer qui explose, et ca prend du temps.

    Table Entreprise : 550 000 lignes
    Table Libelle : 1 600 lignes
    Ca fait 880M comparaison, olé !

    Par la suite il faudra que j'insere le resultat dans une table.

    Jvoulais savoir si vous auriez une idee pour optimiser la comparaison ? Merci

  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
    Fait les jointure en SQL en non pas en PL/SQL

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Un curseur pour ensuite faire un test LIKE en PL ?!
    Houlala... quelle hérésie !

    Faut que tu saches qu'un curseur peut prendre un paramètre.
    Pour info (parce qu'il faut faire comme l'a signalé Mnitu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
    CURSOR entcur (p_lib IN VARCHAR2) IS 
    	SELECT id_ent, nom 
    	FROM entreprise
        WHERE full_name LIKE p_lib;
    BEGIN
      FOR LABEL IN (SELECT lib FROM libelle)
      LOOP
        FOR ent IN ptcur (LABEL.lib)
        LOOP
          DBMS_OUTPUT.PUT_LINE(ent.id_ent || ' - ' || ent.full_name || ' - ' ||LABEL.lib);
        END LOOP;
      END LOOP;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Voila qui devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARE 
    result VARCHAR2(4000);
    BEGIN
    FOR i IN (SELECT ent.id_ent || ' - ' || ent.full_name || ' - ' ||label.lib 
       INTO result
      FROM libelle label, entreprise ent
     WHERE ent.full_name LIKE label.lib) LOOP
       DBMS_OUTPUT.PUT_LINE(i.result);
    END LOOP;
    END;
    /
    Ou simplement en SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ent.id_ent || ' - ' || ent.full_name || ' - ' ||label.lib 
       INTO result
      FROM libelle label, entreprise ent
     WHERE ent.full_name LIKE label.lib

  5. #5
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Super, merci.

    J'ai essayé la procedure de McM, nikel, par contre j'ai un probleme avec celle de orafrance.

    Error report:
    ORA-06550: line 8, column 27:
    PLS-00302: component 'RESULT' must be declared
    ORA-06550: line 8, column 4:
    PL/SQL: Statement ignored
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:
    ??

    Et dire qu'une simple requete SQL suffit lol, pourquoi faire simple quand on peut faire compliqué...

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    AS result et non pas INTO result

    un mauvais copier-coller.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    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
    Citation Envoyé par B&B Voir le message
    Et dire qu'une simple requete SQL suffit lol, pourquoi faire simple quand on peut faire compliqué...
    Avec le grand avantage que c’est la base des données qui choisit le meilleur algorithme pour faire la jointure surtout quand les informations données par les statistiques sont fiables.

Discussions similaires

  1. Optimiser une boucle For Each
    Par zaghi dans le forum VB.NET
    Réponses: 14
    Dernier message: 21/06/2012, 11h19
  2. Optimisation des boucles for
    Par Kikouyou1080 dans le forum Général Python
    Réponses: 5
    Dernier message: 04/06/2010, 17h16
  3. optimiser une boucle for
    Par bakaratoun dans le forum MATLAB
    Réponses: 2
    Dernier message: 28/01/2010, 14h22
  4. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 17h59
  5. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 09h55

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