|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Bonjour,
Je rencontre un souci avec les dates dans Oracle (je sais, c'est pas original). J'ai la requête suivante : Code :
Code :
Par contre, si je rajoute une clause where comme suit : Code :
Comment se fait-il qu'une telle erreur se produise dans le where, alors même que dans le select la conversion to_date fonctionne ?! Je veux dire, à partir du moment où la conversion du varchar2 en date fonctionne, pourquoi sa comparaison avec sysdate échoue ? Merci d'avance. |
||||||
|
|
00
|
|
|
#2 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
|
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 520 ![]() |
Effectivement, j'ai écris une très belle c*nn*ri*...
Je vais reprendre un café et fermé ma bouche....
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Malheureusement, cela ne change rien...
D'ailleurs, je précise que si je retire toute la clause WHERE, la requête fonctionne, le to_date renvoie null si la valeur de cv.value est null aussi. Je précise aussi que je dispose de 3 bases : une de test, une de prod et une perso. Sur la test, j'ai l'erreur ORA-1861. Sur la prod, c'est une erreur ORA-1860 (input value not long enough for date format). Sur ma base perso, par contre, je n'ai aucune erreur ! J'ai comparé le contenu de la table nls_session_parameters sur les 3 bases, elles sont identiques. De plus, voici les versions des bases : Base de test : Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production Base de prod : Oracle9i Release 9.2.0.7.0 - 64bit Production Base perso : Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production Est-ce que cela pourrait être lié au fait que les bases de test et de prod sont en 64bit ? |
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Est-ce qu’il y a un index sur CV.VALUE ?
|
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
quel est le résultat de
Code :
|
||
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
laurentschneider > la requête renvoie le résultat suivant :
mnitu > non, par contre il y a un index sur la colonne variable. Merci. |
|
|
00
|
|
|
#8 | ||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Votre requête corresponde en fait à la requête suivante:
Code :
[Edit] La requête suivante devrait se planter avec la même erreur Code :
|
||||
|
|
00
|
|
|
#9 | |||||||
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Citation:
Citation:
Citation:
|
|||||||
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Et cette requête ça fonctionne ?
Code :
|
||
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Non, mais c'est normal car la table CASE_VARIABLE contient des valeurs de variables, donc elle possède au moins 2 colonnes : "variable" qui contient le nom de la variable, et "value" qui contient sa valeur.
Dans mes requetes, je me limite à la variable "ddi_sap_date_demande" car c'est elle que je veux récupérer dans la table. Sans cette condition, je vais récupérer toutes les variables de la table, dont celles qui ne sont pas des dates (d'où l'erreur). |
|
|
00
|
|
|
#12 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
bien sûr donc, rajoute sap au case
Code :
|
||
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Dans le cas où l’optimiseur accède aux donnés via la colonne tcid et ensuite filtre avec to_date il y a plantage.
Dans le cas ou il prend le chemin qui accède ou filtre d’abord via la condition CV.variable = 'ddi_sap_date_demande' il n’y a plus d’anomalie. Reprenez la proposition fait par laurent mais au lieu de tester w.id = 306634 dans le CASE testez variable = 'ddi_sap_date_demande' |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
La dernière requête de laurent fonctionne.
A noter aussi que si je déplace la condition "AND CV.variable = 'ddi_sap_date_demande'" du inner join dans le where (sans utiliser de case), ça fonctionne aussi. Il y a des chose qui m'échappent dans cette histoire, mais au moins je ne suis plus bloqué. Merci à tous ! |
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
|
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
Oui, l'important était de filtrer sur le nom de la variable, afin d'être certain de ne récupérer que les valeurs pouvant être converties en date.
Je ne pensais simplement pas qu'il était nécessaire de refiltrer à nouveau dans le WHERE, vu qu'il y a déjà un filtre sur la jointure, et que le SELECT fonctionne sans CASE. |
|
|
00
|
|
|
#17 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Oracle transforme votre requête comme bon il lui semble.
Dans ce cas écrivez votre requête ainsi Code :
|
||
|
|
00
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
Mouais, la façon dont Oracle interprète les conditions "WHERE" et les jointures "ON" n'est vraiment pas glorieuse.
Avec le CASE, on est toujours plus tranquille, avec une clause where, ou sous-requête, un hint ou autre, ça peut toujours planter au prochain patch... Optimizer Tuning oblige
|
|
10
|
|
|
#19 |
|
Invité de passage
![]() Inscription : avril 2003 Messages : 21 ![]() |
C'est exactement la requête à laquelle je pensais, faire un inner join sur un select déjà filtré, mais vous voulez rire ? Ca ne marche pas ! J'ai une erreur ORA-01861.
Par contre, en ajoutant un CASE ou la condition sur "ddi_sap_date_demande" dans le WHERE avant le TO_DATE, ça refonctionne bien sur. |
|
|
00
|
|
|
#20 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Oui je me suis dit après que
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com