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 :

Optimisation de requete PL/SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut Optimisation de requete PL/SQL
    Je cherche à faire une requete du type mais je ne vois pas trop comment m'y prendre

    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
     
     
     DECLARE
     
       valeurcount INTEGER;
     
     BEGIN
     
      -- copie des données de la table tmp_chantier  vers la table cd 
       FOR r IN (
         select ctc.id_ctc,
    	    c.ct_code,
    	    c.mo_code,
                c.ct_libelle,
                c.ct_type_local 
         from tmp_chantier c, ctc, chantier_directeur cd
         where c.ct_type_local = 'D'
           --and c.et_code = ctc.code_ctc
           --and c.ct_code = cd.code_cd
       )
       LOOP
     
         select count (*) into valeurcount sur les données de la requete si dessus  where
             c.et_code = ctc.code_ctc (1)
         and c.ct_code = cd.code_cd (2);
     
     
         IF valeurcount == 0 THEN
            nouveau test sur les valeur repectant les conditions (1) et (2) avant insert
         ELSE
         	insert into ... pour les valeurs ne respectant pas les conditions (1) et (2)
         END IF;
     
     
     
    END LOOP;
     
     
    COMMIT;
     
    END;
    /

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      -- copie des données de la table tmp_chantier  vers la table cd
       FOR r IN (
         select ctc.id_ctc,
           c.ct_code,cd.code_cd, c.et_code, ctc.code_ctc
           c.mo_code,
                c.ct_libelle,
                c.ct_type_local
         from tmp_chantier c, ctc, chantier_directeur cd
         where c.ct_type_local = 'D'
           --and c.et_code = ctc.code_ctc
           --and c.ct_code = cd.code_cd
       )
    (1) r.ct_code=r.code_cd
    (2) r.ct_code = r.code_cd

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Mon problème est plus dans la construction de la requete pour respecter les if. Et il possible de faire qqch d ustyle

    Select * from...
    WHERE [ (1) AND (2) AND (3) ]
    OR [ (1) AND NOT (2) ]
    OR [ NOT (1) AND (2) ]


    afin de respecter les conditions du si...sinon...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    bien sûr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      where (c.ct_type_local = 'D'
           AND c.et_code = ctc.code_ctc
           AND c.ct_code = cd.code_cd)
    OR  (c.ct_type_local = 'D'
           AND c.et_code = ctc.code_ctc)
    OR (c.ct_type_local = 'D'
           AND c.ct_code = cd.code_cd)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Tu ne spécifie pas quand c'est not (1) ou not (2)...car en fait si c'est égal ce sera pris en compte dans la première condition. Est ce bien ca??

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    en fait, on peut même simplifier mais là j'ai pas le temps de regarder

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    J'ai un autre problème. Quand je suis dans le cas de la condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (c.ct_type_local = 'D'
           AND c.et_code = ctc.code_ctc)
    J'ai un problème car dans ce cas je ne veux plus de la jointure avec la table chantier_directeur..comment faire???

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Juste si quelqu'un a le temps de jeter un coup d'oeil, je mets les regles de gestion que je dois respecter..juste pour avoir un schéma de requete et faire qqch d'optimiser


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Pour une instance de la table TMP_CHANTIER, si le duo code chantier et code établissement (ct_code et et_code de TMP_CHANTIER) n’existe pas dans la table CD (code_cd et via id_ctc) ou la table CA (code_ca et via id_ctc) alors l'instance doit vérifier que
    - ct_type_local (TMP_CHANTIER) est égale à 'D', 'M' ou 'V'
    - si ct_type_local (TMP_CHANTIER) est égale à 'D' alors uo_code (TMP_CHANTIER) est vide
    - si ct_type_local (TMP_CHANTIER) est égale à 'M' ou 'V' alors uo_code (TMP_CHANTIER) est présent dans la table de référence UO
    Si cela n'est pas respecté l'application rejette l'import local en cours."
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pour une instance de la table TMP_CHANTIER, si le duo code chantier et code établissement (ct_code et et_code de TMP_CHANTIER) est présent dans la table CD (code_cd, via id_ctc) alors l'application ne fait aucun test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "Pour une instance de la table TMP_CHANTIER, si le duo code chantier et code établissement (ct_code et et_code de TMP_CHANTIER) est présent dans la table CA (code_ca, via id_ctc) alors l'instance doit vérifier que
    - ct_type_local (TMP_CHANTIER) est égale à 'M' ou 'V'
    - uo_code (TMP_CHANTIER) est présent dans la table de référence UO
    Si cela n'est pas respecté l'application rejette l'import local en cours."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pour une instance de la table TMP_CHANTIER, le duo code chantier et code établissement (ct_code et et_code de TMP_CHANTIER) ne peut pas être présent dans la table CD et CA.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    remplace les jointures par des clauses IN (SELECT...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Est ce que j'utilise bien la clause In(SELECT.. car j'ai une erreur expression absente??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    select *
         from tmp_chantier c
         where c.ct_type_local = 'D'
           and 
                ( (in select code_ctc from ctc where c.et_code = ctc.code_ctc)
                   and (in select cd.code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)
                 )

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    non

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Merci de ton aide. Ma requete marche :

    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
     select c.ct_libelle,
    	      c.ct_code,        
            c.et_code,        
            c.uo_code,
            c.mo_code
         from tmp_chantier c
         where c.ct_type_local = 'D'
           and (    
                ( c.et_code in (select code_ctc from ctc where c.et_code = ctc.code_ctc)
                  and c.ct_code in (select code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)
                ) -- regle IMP-N2
                or  
                ( c.ct_code in (select code_cd from chantier_directeur cd where c.ct_code = cd.code_cd)
                  and c.uo_code = -1 
                ) -- regle IMP-N1
                or  
                ( c.et_code in (select code_ctc from ctc where c.et_code = ctc.code_ctc)
                  and c.uo_code = -1
                ) -- regle IMP-N1
               )

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Une dernière question... commet je fais pour récupérer des valeurs contenus dans mes tables de jointure car les champs ne sont plus dans le select (par ex ctc.id_ctc).
    J'en ai besoin pour faire mon insert apres

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

Discussions similaires

  1. Comment optimiser une requete Update SQL ?
    Par Battosaiii dans le forum SQL
    Réponses: 3
    Dernier message: 20/07/2011, 13h51
  2. Optimisation de requetes SQL sous oracle
    Par santana2006 dans le forum Oracle
    Réponses: 5
    Dernier message: 28/08/2006, 19h26
  3. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  4. Optimisation de requete SQL
    Par dark_vidor dans le forum Requêtes
    Réponses: 12
    Dernier message: 15/01/2006, 20h40
  5. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26

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