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 :

TO_DATE fonctionne dans un SELECT mais provoque une erreur ORA-01861 (littéral non concordant) dans un WHERE !


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut TO_DATE fonctionne dans un SELECT mais provoque une erreur ORA-01861 (littéral non concordant) dans un WHERE !
    Bonjour,

    Je rencontre un souci avec les dates dans Oracle (je sais, c'est pas original).
    J'ai la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM      workcase w
             INNER JOIN
                case_variable CV
             ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
     WHERE   w.id = 306634
    Qui me renvoie le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    VALUE = 2011/03/16  00:00:00
    DATE_DEMANDE = 16/03/2011
    Manifestement, la requête fonctionne donc (la colonne value est de type varchar2(2000) pour info).
    Par contre, si je rajoute une clause where comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM      workcase w
             INNER JOIN
                case_variable CV
             ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
     WHERE   w.id = 306634
             AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
    J'obtiens une erreur ORA-01861 !
    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.

  2. #2
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par lasyan3 Voir le message
    Manifestement, la requête fonctionne donc (la colonne value est de type varchar2(2000) pour info).
    to_date formate une chaine en date (d'où son nom) et non l'inverse !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lasyan3 Voir le message
    to_date formate une chaine en date (d'où son nom) et non l'inverse !
    Effectivement, j'ai écris une très belle c*nn*ri*...
    Je vais reprendre un café et fermé ma bouche....

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    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 ?

  5. #5
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Est-ce qu’il y a un index sur CV.VALUE ?

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    quel est le résultat de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT   CV.VALUE
      FROM      workcase w
             INNER JOIN
                case_variable CV
             ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
     WHERE   w.id = 306634

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    laurentschneider > la requête renvoie le résultat suivant :
    mnitu > non, par contre il y a un index sur la colonne variable.

    Merci.

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Votre requête corresponde en fait à la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM  case_variable CV
     WHERE   CV.tcid = 306634
       AND CV.variable = 'ddi_sap_date_demande'
       AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
    Il doit y avoir une valeur non-date dans la colonne CV.VALUE parmi les enregistrements qui ont CV.variable = 'ddi_sap_date_demande'

    [Edit]
    La requête suivante devrait se planter avec la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM  case_variable CV
     WHERE  CV.variable = 'ddi_sap_date_demande'
    [/EDIT]

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par mnitu Voir le message
    La requête suivante devrait se planter avec la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM  case_variable CV
     WHERE  CV.variable = 'ddi_sap_date_demande'
    [/EDIT]
    Justement, non, elle fonctionne ! C'est ce que je disais au début, le select fonctionne sans problème, mais le where plante ! C'est ça qui est énorme !

    Citation Envoyé par mnitu Voir le message
    Il doit y avoir une valeur non-date dans la colonne CV.VALUE parmi les enregistrements qui ont CV.variable = 'ddi_sap_date_demande'
    A part des valeurs à null, toutes les valeurs sont du bon format, j'ai vérifié.

    Citation Envoyé par mnitu Voir le message
    Votre requête corresponde en fait à la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM  case_variable CV
     WHERE   CV.tcid = 306634
       AND CV.variable = 'ddi_sap_date_demande'
       AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
    Alors là c'est fort : cette requête fonctionne ! Ce serait lié à la jointure ?! WTF !!!

  10. #10
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Et cette requête ça fonctionne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM  case_variable CV
     WHERE  CV.tcid = 306634

  11. #11
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    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).

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    bien sûr donc, rajoute sap au case


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT   CV.VALUE,
             CASE WHEN w.id = 306634 AND CV.variable = 'ddi_sap_date_demande'
    THEN
                 TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') 
             END AS date_demande
      FROM      workcase w
             INNER JOIN
                case_variable CV
             ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
     WHERE   w.id = 306634
             AND CASE WHEN w.id = 306634 AND CV.variable = 'ddi_sap_date_demande'
    THEN
                 TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') 
             END = SYSDATE

  13. #13
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    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'

  14. #14
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    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 !

  15. #15
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par lasyan3 Voir le message
    ...Il y a des chose qui m'échappent dans cette histoire, mais au moins je ne suis plus bloqué. Merci à tous !
    Pourtant je viens de vous l'expliquer.
    Dans la requête proposé par laurent le case sur w.id CASE WHEN w.id = 306634 ne sert à rien en fait.

  16. #16
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    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.

  17. #17
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Oracle transforme votre requête comme bon il lui semble.
    Dans ce cas écrivez votre requête ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT   CV.VALUE,
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
      FROM      workcase w
             INNER JOIN
             (Select * from  case_variable where variable = 'ddi_sap_date_demande') CV
             ON CV.tcid = w.id 
     WHERE   w.id = 306634
             AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE

  18. #18
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    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

  19. #19
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    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.

  20. #20
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Oui je me suis dit après que
    Oracle transforme votre requête comme bon il lui semble.
    peut être aussi valable pour ma proposition.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/02/2013, 18h49
  2. Caractère provoquant une erreur dans une requête
    Par defluc dans le forum Firebird
    Réponses: 4
    Dernier message: 04/02/2008, 12h14
  3. Réponses: 6
    Dernier message: 29/05/2006, 11h21
  4. msaccess a provoqué une erreur dans KERNEL32.dll
    Par massol joel dans le forum Access
    Réponses: 12
    Dernier message: 03/04/2006, 14h32
  5. Select Case provoque une erreur
    Par defluc dans le forum SQL
    Réponses: 6
    Dernier message: 14/08/2005, 23h59

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