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 :

Meilleure manière d'éviter de dupliquer une requete


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut Meilleure manière d'éviter de dupliquer une requete
    Bonjour,

    ne travaillant pas depuis longtemps en SQL, je me pose encore des question sur la meilleure manière de faire les choses.

    Mon problème est que j'ai fréquemment des requêtes qui se répètent dans mes différents traitements. Ce n'est pas un problème pour l'instant mais ca le deviendra probablement lorsque je devrais modifier ces requêtes dans le futur et que la base de données grandira.

    Pour l'instant, pour éviter de dupliquer le code, je crée des fichiers SQL auxquels je passe des paramètres selon les cas et j'utilise des tables temporaires pour ne pas relancer trop de fois la même requête ou pour pouvoir trier plus simplement les données et ajouter des contraintes pour mon traitement spécifique.

    Le problème est que j'exécute parfois 3-4 fois la même requête. Comment éviter d'exécuter plusieurs fois les requêtes?

    Par exemple je voudrais éviter le cas simple suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE table 
    SET (champ1, champ2,...) =
    (
       REQUETE1
    )
    WHERE EXISTS
    (
       REQUETE1
    )

    Est-il possible de stocker dans une variable le contenu d'une requête (pas son texte) sans la ré exécuter et de la passer en paramètre d'une autre requète SQL en pur SQL?

    Ou alors est-il possible, en PL/SQL par exemple, de faire quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CURSOR curs IS REQUETE1;
    ...
    UPDATE table 
    SET (champ1, champ2,...) =
    (
       curs
    )
    WHERE EXISTS
    (
       curs
    )
    J'avoue que j'arpente différentes doc depuis quelques heures sans trouver de "belle" solution.

    Merci d'avance

    Eb

  2. #2
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    je crois que le SQL dynamique est ton meilleur ami dans ce cas.

  3. #3
    Membre expérimenté
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Par défaut
    Ca dépend de ce qui est dans ta requête, mais la manière la plus générale d'éviter d'écrire plusieurs fois le même code est d'écrire une procédure en PL/SQL dans laquelle tu définira tes requêtes, et que tu appelleras à l'endroit voulu dans ton code.

    Je te conseille de jeter un coup d'oeil sur les exemples de procédures, fonctions et packages présents sur le site.

  4. #4
    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
    Citation Envoyé par el-belgounetos Voir le message
    ...Pour l'instant, pour éviter de dupliquer le code, je crée des fichiers SQL auxquels je passe des paramètres selon les cas et j'utilise des tables temporaires pour ne pas relancer trop de fois la même requête ou pour pouvoir trier plus simplement les données et ajouter des contraintes pour mon traitement spécifique.
    Table temporarire c'est mauvais.
    Relancer N fois la même requête c'est mauvais (où N > 1)

    Citation Envoyé par el-belgounetos Voir le message
    ...
    Le problème est que j'exécute parfois 3-4 fois la même requête. Comment éviter d'exécuter plusieurs fois les requêtes?

    Par exemple je voudrais éviter le cas simple suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE table 
    SET (champ1, champ2,...) =
    (
       REQUETE1
    )
    WHERE EXISTS
    (
       REQUETE1
    )
    Regardez plutôt Merge pour ce cas.

  5. #5
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Table temporaire c'est mauvais.
    Que puis-je utiliser pour que ca soit bon lorsque j'ai des gros traitements et filtrages à faire derrière? Vues, vraies tables, ...?

    Citation Envoyé par mnitu Voir le message
    Relancer N fois la même requête c'est mauvais (où N > 1)
    C'est pourquoi j'essaye de trouver une façon de ne pas le faire mais je n'arrive pas à trouver de solution satisfaisante, par exemple en PL/SQL ou SQL qui ferait ce que je veux. Je voudrais donc savoir si ça existe ou si à un moment ou un autre je vais devoir répéter ma requête.

    Exemple bidon: comment pourrais je faire quelque chose de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    variable = 
    (SELECT id 
    FROM table);
     
    SELECT nom
    FROM table2
    WHERE id IN variable;
     
    SELECT id
    FROM variable
    WHERE id>100;
    Où variable serait le résultat de l'exécution de la requête et non pas le texte de la requête. Est-il possible de le faire en PL/SQL comme ça ou de manière détournée?

    Citation Envoyé par mnitu Voir le message
    Regardez plutôt Merge pour ce cas.
    [/QUOTE]

    Merci beaucoup, j'avais utilisé Oracle 8i et je ne connaissais pas. C'est exactement ce que je cherchais pour faire certains de mes UPDATE.

    Merci à tous en tout cas,

    EB

  6. #6
    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
    Citation Envoyé par el-belgounetos Voir le message
    Que puis-je utiliser pour que ca soit bon lorsque j'ai des gros traitements et filtrages à faire derrière? Vues, vraies tables, ...?
    Si votre traitement est de type ETL (extract, transforme, load) regardez les fonctions pipelined. Elles vous permettront de remplacer les traitements lourds en PL/SQL ou autre langage, de type : je cherche les données à droit; pour chaque donné ainsi trouvé je cherche à gauche; je mets tout dans une table temporaire, je supprime dans ce table les enregistrements que je n’aime pas, et à la fin j’ajoute le contenu de la table temporaire à LA_TABLE par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Insert into LA_TABLE 
    Select col1, col2, ...
      From Table(ma_fonction_pipelined)
    Citation Envoyé par el-belgounetos Voir le message
    C'est pourquoi j'essaye de trouver une façon de ne pas le faire mais je n'arrive pas à trouver de solution satisfaisante, par exemple en PL/SQL ou SQL qui ferait ce que je veux. Je voudrais donc savoir si ça existe ou si à un moment ou un autre je vais devoir répéter ma requête.

    Exemple bidon: comment pourrais je faire quelque chose de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    variable = 
    (SELECT id 
    FROM table);
     
    SELECT nom
    FROM table2
    WHERE id IN variable;
     
    SELECT id
    FROM variable
    WHERE id>100;
    Où variable serait le résultat de l'exécution de la requête et non pas le texte de la requête. Est-il possible de le faire en PL/SQL comme ça ou de manière détournée?
    Utilisez de jointures en SQL et non pas dans le PL/SQL, utilisez de sous-requêtes, faite le plus possible en SQL, traversez les tables une seule fois, etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select t.id, t2.nom,
           case when t.id > 1000 Then t.id end As id_sup_1000 
      From table t 
           <LEFT OUTER ?> Join 
           table2 t2
        On (t2.id = t.id)

  7. #7
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut
    Merci pour ces quelques compléments.

    Pour l'instant j'arrive à me passer de PL/SQL grâce à une bonne hiérarchie dans mes requêtes. Comme dirais Lafesse, pourvu que ça dure.

    Eb

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

Discussions similaires

  1. Dupliquer une requete d une base vers une autre
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 15/07/2010, 14h09
  2. Réponses: 5
    Dernier message: 25/04/2008, 15h37
  3. Dupliquer une requete
    Par ledu_alexandre dans le forum Deski
    Réponses: 3
    Dernier message: 08/11/2007, 15h30
  4. Réponses: 2
    Dernier message: 19/03/2007, 17h41
  5. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 20h37

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