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 :

index et la fonction nvl


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Par défaut index et la fonction nvl
    Bonjour,

    SELECT col1 AS col1s ,
    col2 AS col2s,
    col3 AS col3s ,
    col4 AS col4s,
    FROM matable
    WHERE col1 = nvl(15837, col1)
    AND col2 = nvl('DE0001040350', col2)
    AND col3 = nvl('ISIN', col3)
    AND col4 = nvl('WM', col4)
    AND REMAINING_ATTEMPTS > 0
    AND (STATUS = nvl('NO_OCCURR', STATUS) OR STATUS = nvl('NO_OCCURR', STATUS)
    OR STATUS = nvl('NO_OCCURR', STATUS) OR STATUS = nvl('NO_OCCURR', STATUS)
    OR STATUS = nvl('NO_OCCURR', STATUS));

    toutes les colonnes sont indexées col1,col2, col3, col4 mais comme vous le voyez , la fonction nvl empeche l’utilisation de ces indexes, quelqu’un a une idée, comment transformer le nvl ou la requete, pour qu’oracle voit ces indexex?
    Je ne sais pas si je peux aussi creer des indexes de focntions?

    Merci d’avance!!!!

  2. #2
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Il faut passer par du sql dynamique et ne créer ta condition seulement si ton paramètre n'est pas nul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Select_V := ' SELECT Col1, Col2, Col3 ';
    From_V := ' From Table1 ';
    Where_V := ' Where 1=1 ';
    if Param1 is not null then
       Where_V := Where_V || ' And Col1 = Param1 ';
    End if;
    If Param2 is not null then
       Where_V := Where_V || ' And Col2 = Param2 ';
    End if
    ...
    Ensuite si ta requêtes ramène uniquement une ligne (mais j'en doute quand on a tant de paramètre optionnel, tu utilses le EXECUTE IMMEDIATE, sinon, tu passes par un REF_CURSOR

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Etes-vous sûr de la requête ? Une expression SQL n'a pas vraiment de sens car 'cccc' est un littéral (une valeur en 'dur') qui n'est donc jamais null au sens SQL ...

    PS:
    Quelle est version d'Oracle ?
    Merci d'utiliser d'utiliser les balises pour l'affichage de code.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Par défaut
    Bonjour à tous , je suis oracle 9ir2

    mais je pense pifor que t’as raison , en fait cette requête je l’ai récupérée de la vue v$sqlarea, dont le but de l’optimiser, et la vraie écriture était blindée donc au lieu de ces valeurs en dure et fixe que j’ai données, il y avait :1 :2 :3 :4, mais est ce qu’on peut dire toujours que ça ne sera jamais nulle avec les binds variable ?

    Merci de votre reponse

  5. #5
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Citation Envoyé par Mehdilis Voir le message
    Bonjour à tous , je suis oracle 9ir2

    mais je pense pifor que t’as raison , en fait cette requête je l’ai récupérée de la vue v$sqlarea, dont le but de l’optimiser, et la vraie écriture était blindée donc au lieu de ces valeurs en dure et fixe que j’ai données, il y avait :1 :2 :3 :4, mais est ce qu’on peut dire toujours que ça ne sera jamais nulle avec les binds variable ?

    Merci de votre reponse
    non, une bind variable ne certifie pas qu'elle ne soit pas nulle, c'est une variable, c'est tout
    Tu dois tester la valeur que tu vas passer dans ta bind variable en amont de l'exécution de ta requête comme je te l'ai indiqué dans ma réponse précédente

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Par défaut
    Je vous remercie tous, en fait j'ai reglé le probleme, en interdidant sous le progrmme appelant java de ne faire rentrer que des valeurs not nulle, du coup le nvl(constante, colonne) =constante et le nvl ne servira a rien dans ce cas, alors je les ai dégagés et les indexes déjà existe seont exploitable et la requete est devenu optimisée, mille merci à vous tous pour vos explications.

Discussions similaires

  1. La fonction NVL de Oracle et JDBC
    Par santana2006 dans le forum JDBC
    Réponses: 3
    Dernier message: 18/09/2006, 13h39
  2. [SQL] fonction NVL
    Par bmoon dans le forum Oracle
    Réponses: 2
    Dernier message: 17/03/2006, 10h54
  3. [ORACLE 8i] Index sur des fonctions
    Par miloux32 dans le forum Oracle
    Réponses: 1
    Dernier message: 02/02/2006, 17h52
  4. Un group by sur une fonction nvl
    Par Arkadius dans le forum Oracle
    Réponses: 3
    Dernier message: 21/10/2005, 10h47
  5. Equivalent de la fonction NVL sous oracle en SQL-server
    Par MorbidAngel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/09/2005, 10h50

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