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 :

Appeler une fonction dans une close where !


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 74
    Points
    74
    Par défaut Appeler une fonction dans une close where !
    Bonjour!
    je me trouve face au beosins d'appeler une fonction dans une close where,
    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select c1, c2, c3
    from ma_premiere_table tab1,
           ma_deuxieme_table tab2
    where tab2.c3=ma_fonction(tab1.c3)

    ... ça m'apparait pas tres optimisé comme code...


    alors votre avis !!?

    Merci par avance.
    PMS

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Il est impossible de se prononcer dans l'absolue de cette façon ...
    Dans certains cas, il est effectivement possible d'écrire la requête sans faire recours à la fonction et il est concevable dans ce cas de considérer la fonction comme une mauvaise solution.

    Il ne faut pas oublier non plus que les index basés sur des fonctions permettent de booster la perforlance ...
    Consultant et formateur Oracle

  3. #3
    Membre régulier
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Michel SALAIS Voir le message
    Il est impossible de se prononcer dans l'absolue de cette façon ...
    Dans certains cas, il est effectivement possible d'écrire la requête sans faire recours à la fonction et il est concevable dans ce cas de considérer la fonction comme une mauvaise solution.

    Il ne faut pas oublier non plus que les index basés sur des fonctions permettent de booster la perforlance ...
    Merci pour la reponse... mais

    malheureusement je suis face à un cas où je n'ai pas de choix autre qu'une fonction...
    Sauf que:
    1- soit je crée une table d'une seule colonne , et la fonction alimentera alors cette table.... et donc j'interrogerai la table.
    2- faire une table function... et donc faire des selects directement sur la fonction.... je sais que c'est faisable..; mais comment?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT c1, c2, c3
    FROM ma_premiere_table tab1,
           ma_deuxieme_table tab2
    WHERE tab2.c3=ma_fonction(tab1.c3)
    Alors si la fonction est inévitable, et vu le code ci-dessus:
    Créer un index basé sur la fonction. En gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create index ...
    on tab1 (ma_fonction(c3))
    Si c'est une fonction PL/SQL que vous définissez vous-même alors elle doit être déclarée DETERMINISTIC
    Consultant et formateur Oracle

  5. #5
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Pour privilégier des étapes bien séparées , je proposerais aussi la requête ci-dessous, à comparer avec la solution d'un index sur la fonction. (Mais c'est vrai qu'il vaut mieux éviter les jointures sur les fonctions en générale bien que les index sur fonctions existent depuis un certain nombre de version d'Oracle).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c1, c2, c3
    FROM 
      (SELECT c1, ma_fonction(tab1.c3) c3_f
      FROM ma_premiere_table )
    tab1
    INNER JOIN    ma_deuxieme_table tab2
    ON tab2.c3=tab1.c3_f

    Comme ça, cela exécute la fonction pour chaque ligne lors du sous-SELECT, mais lors de la jointure le résultat de la fonction a déjà été calculée dans la sous-requête.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par phili_b Voir le message
    Pour privilégier des étapes bien séparées , je proposerais aussi la requête ci-dessous, à comparer avec la solution d'un index sur la fonction. (Mais c'est vrai qu'il vaut mieux éviter les jointures sur les fonctions en générale bien que les index sur fonctions existent depuis un certain nombre de version d'Oracle).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c1, c2, c3
    FROM 
      (SELECT c1, ma_fonction(tab1.c3) c3_f
      FROM ma_premiere_table )
    tab1
    INNER JOIN    ma_deuxieme_table tab2
    ON tab2.c3=tab1.c3_f

    Comme ça, cela exécute la fonction pour chaque ligne lors du sous-SELECT, mais lors de la jointure le résultat de la fonction a déjà été calculée dans la sous-requête.
    Ceci est discutable et Oracle peut choisir de faire autrement ...
    Consultant et formateur Oracle

  7. #7
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Je ne remets pas en cause ta solution qui est la meilleure si l'index sur la fonction est performant. Je propose simplement une alternative qui fonctionne pas trop mal si la création de l'index n'est pas possible ou non performant(= non discriminant par exemple).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    En fait et indépendamment de l'index basé sur la fonction, ce que je voulais dire que le calcul de la fonction dans ta requête n'est pas assuré de la façon que tu propose vu qu'Oracle peut faire la fusion d'une vue (requête imbriquée) dans la requête principale et alors il est nécessaire d'utiliser des hints ...
    Consultant et formateur Oracle

  9. #9
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par Michel SALAIS Voir le message
    vu qu'Oracle peut faire la fusion d'une vue (requête imbriquée) dans la requête principale
    ah ok ! je comprends mieux.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. Appel d'une fonction dans une fonction (sql server 2005)
    Par catchouse dans le forum Développement
    Réponses: 10
    Dernier message: 06/05/2009, 12h03
  4. Réponses: 1
    Dernier message: 25/10/2007, 18h04
  5. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39

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