Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/09/2007, 21h43   #1
Nouveau Membre du Club
 
Inscription : août 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 137
Points : 26
Points : 26
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!!!!
Mehdilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 10h47   #2
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Il faut passer par du sql dynamique et ne créer ta condition seulement si ton paramètre n'est pas nul
Code :
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
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 10h49   #3
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
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.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 12h48   #4
Nouveau Membre du Club
 
Inscription : août 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 137
Points : 26
Points : 26
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
Mehdilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2007, 11h40   #5
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
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
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2007, 01h27   #6
Nouveau Membre du Club
 
Inscription : août 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 137
Points : 26
Points : 26
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.
Mehdilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h55.


 
 
 
 
Partenaires

Hébergement Web