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 :

Date et erreur de type sur la console sql*plus


Sujet :

SQL Oracle

  1. #1
    Invité
    Invité(e)
    Par défaut Date et erreur de type sur la console sql*plus
    Bonsoir ,

    J'execute la requête suivante qui me retourne un " inconsistent datatypes: expected DATE got NUMBER " sous la console SQL*PLUS ORACLE 9.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    alter session set nls_territory='FRANCE';
    alter session set nls_date_language='FRENCH';
    ALTER SESSION SET NLS_DATE_FORMAT='DDMMYYYY' ;
     
    Undefine date_deb
    Undefine date_fin 
     
    accept date_deb prompt 'Saisir la date de début de période (jjmmaaaa) : '
     
    accept date_fin prompt 'Saisir la date de fin de période (jjmmaaaa) : ' 
     
    select code1, libcode1 , code2 , refcode2 , libcode2, round(sum(duree)/60,2) as duree_minute_vers_heure,  TO_DATE(madate,'WW') as semaine
    from tab1
    left join tab2 on tab1.code1=tab2.code1     
    left join tab3 on tab1.code2=tab3.code2
    where acvdtd_aag between &date_deb and &date_fin
    and libcode1 LIKE 'toto%'
    group by code1, libcode1 , code2 , refcode2ref , libcode2,TO_DATE(madate,'WW');

    En base les dates ont ce format : AAAAMMJJ. Je souhaite à la place le numéro de semaine.

    Merci de m'aiguiller.

    Je ne vois pas pourquoi il me dit que le type date est sachant que c'est déjà une date ...
    Dernière modification par al1_24 ; 28/09/2015 à 18h29.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Habituellement, SQL*Plus précise la ligne sur laquelle l'erreur est rencontrée... ce qui peut orienter vers sa résolution.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir

    1) Le problème vient de cette fonction :
    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_DATE(madate,'WW')
    .

    2) L'erreur " inconsistent datatypes: expected DATE got NUMBER " vient de la ligne 6 du script . Ici je ne vois pas pourquoi il y a un erreur dans le script. J'ai fait un copié collé d'un autre script qui fait appelle exactement à la même fonction (saisi de date pour l'inteval) et dans l'autre requête il n'y aucun plantage.

    Ici Oracle me retourne une erreur alors qu'il n'y a pas lieu d'y en avoir . De plus à l'écran je vois très bien que le requête accepte ce qui est saisie.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Quelle fonction ?

    Peut-on avoir l'intégralité des messages retournés par SQL*Plus ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Voici ce qui est retourné :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SQL> accept date_deb prompt 'Saisir la date de début de période (jjmmaaaa) : ' 
    Saisir la date de début de période (jjmmaaaa) : 20150101
    SQL> accept date_fin prompt 'Saisir la date de fin de période (jjmmaaaa) : ' 
    Saisir la date de fin de période (jjmmaaaa) : 20150201
    SQL > select code1, libcode1 , code2 , refcode2 , libcode2, round(sum(duree)/60,2) as duree_minute_vers_heure,  TO_DATE(madate,'WW') as semaine
    from tab1
    left join tab2 on tab1.code1=tab2.code1     
    left join tab3 on tab1.code2=tab3.code2
    where acvdtd_aag between &date_deb and &date_fin
    and libcode1 LIKE 'toto%'
    group by code1, libcode1 , code2 , refcode2ref , libcode2,TO_DATE(madate,'WW');
     
    select code1, libcode1 , code2 , refcode2 , libcode2, round(sum(duree)/60,2) as duree_minute_vers_heure,  TO_DATE(madate,'WW') as semaine
    from tab1
    left join tab2 on tab1.code1=tab2.code1     
    left join tab3 on tab1.code2=tab3.code2
    where acvdtd_aag between 20150101 and 20150201
    and libcode1 LIKE 'toto%'
    SQL> 
    erreur ligne 6 : ERROR ORA-00932: inconsistent datatypes: expected DATE got NUMBER
    SQL>
    group by code1, libcode1 , code2 , refcode2ref , libcode2,TO_DATE(madate,'WW');

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    L'information intéressante est ici :
    erreur ligne 6 : ERROR ORA-00932: inconsistent datatypes: expected DATE got NUMBER
    La ligne 6 de ta requête c'est : where acvdtd_aag between 20150101 and 20150201.
    Quel est le type de la colonne acvdtd_aag ?
    Sans doute une DATE au vu du message d'erreur qui explique qu'il faut la comparer avec des dates, pas des nombres.

    Yapuka :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where acvdtd_aag between TO_DATE('20150101', 'yyyymmdd') and TO_DATE('20150201', 'yyyymmdd')
    Ou en ramenant le nom des variables à la place des valeurs saisies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where acvdtd_aag between TO_DATE('&datedeb', 'yyyymmdd') and TO_DATE('&datefin', 'yyyymmdd')
    Toute la résolution de ton problème était dans la lecture du message d'erreur.
    Et quand Oracle te dit que l'erreur est à la ligne 6, c'est qu'il a de bonnes raisons de le penser.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour ,

    Citation Envoyé par al1_24
    Quel est le type de la colonne acvdtd_aag ?
    C'est bien une date effectivement .

    Citation Envoyé par al1_24
    ]Toute la résolution de ton problème était dans la lecture du message d'erreur.
    J'ai passé et repassé le code en boucle , il y avait aussi le problème du " YYYYMMDD " et " DDMMYYYY " , soit 2 formats différents .

    Citation Envoyé par al1_24
    Et quand Oracle te dit que l'erreur est à la ligne 6, c'est qu'il a de bonnes raisons de le penser.
    J'ai balayé et rebalayé le code. Si on ne corrigeai pas la première erreur avec les formats " YYYYMMDD " et " DDMMYYYY " , il n'était pas possible de voir la seconde

    Merci des tuyaux

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    J'ai passé et repassé le code en boucle , il y avait aussi le problème du " YYYYMMDD " et " DDMMYYYY " , soit 2 formats différents.
    Il y avait l'erreur dans le texte du prompt, mais rien de plus.
    Une date n'a pas de format, c'est une erreur qu'on voit très fréquemment sur le forum.

    L'affichage d'une date a un format, qu'on peut définir de plusieurs façons, les plus connues étant la fonction to_char et le paramètre nls_date_format.

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Il n'y a personne que ça choque ? Moi ça me sort une erreur
    ORA-01820: format code cannot appear in date input format
    Un TO_DATE c'est pour transformer une chaine de caractère (pas un nombre) en DATE (toujours mettre un format afin d'éviter des erreurs)
    Un TO_CHAR c'est pour transformer une date en une chaine de caractère (avec un format d'affichage)

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour

    A) >> McM :

    Citation Envoyé par McM Voir le message
    Bonjour,

    Il n'y a personne que ça choque ?
    Effectivement , c'est une erreur de ma part. Au lieu de dire ma date , plutôt dire la chaine au format AAAAMMJJ; on se comprendra mieux je pense .

    B) >> McM :

    Citation Envoyé par McM Voir le message
    Bonjour,

    Il n'y a personne que ça choque ?
    Par contre afin d'optimiser le code je préconise de remplacer WW par IW (c'est le numéro de semaine iso le IW ) . Faites un test sur la semaine 31 aout 2015 au 4 septembre 2015. Vous obtenez semaine 35 ET 36 avec le WW. Avec le IW vous obtenez un seul numéro de semaine unique (le 36).

    C) >> al1_24 : Pour te réponde , j'ai détecté un problème de variable dans la boucle suivante :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    -- saisi des variable
     
    accept datedeb prompt 'Saisir la date de début au format (AAAAMMJJ) : ' 
     
    accept datefin prompt 'Saisir la date de fin au format (AAAAMMJJ) : ' 
     
    -- requete 1
     
    select champ1 , champ2 , champdate
    from matableA
    where champdate between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd');
     
    -- requete 2
     
    select champ4 , champ5 , champdate
    from matableB
    where champdate2 between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd');
     
    -- requete 3
     
    select champ6 , champ7 , champdate
    from matableC
    where champdate between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd');

    Quand on lance le code suivant au démarrage on aura ceci :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisir la date de début au format (AAAAMMJJ) :
    Saisir la date de fin au format (AAAAMMJJ) :

    Jusque la tout vas bien , par contre à chaque rêquete on demande à l'utilisateur de resaisir une champs déjà saisie ??? J'ai envie de dire pourquoi la console redemande la chose ; Voici ce que s'affiche :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisir une valeur pour datedeb :
    Saisir une valeur pour datefin :

    D) >> al1_24 : un dernier bug que je viens de trouver. Lorsque je relance la suite de requete via la commande start + lien.sql , Oracle garde en mémoire ce qui a été saisi en premier lieu pour ceci :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisir la date de début au format (AAAAMMJJ) :
    Saisir la date de fin au format (AAAAMMJJ) :

    Le message d'erreur suivant s'affiche :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ancien [numéro de ligne dans la requête] : where champdate between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd')
    nouveau [numéro de ligne dans la requête] : where champdate between to_date('','yyyymmdd') and to_date('','yyyymmdd')
    where champdate between to_date(,'yyyymmdd') and to_date(,'yyyymmdd')
                                    *
    erreur à la ligne [numéro de ligne dans la requête]:
    ora-00936 : missing expression

    Pourtant la variable dispose déjà d'une valeur , pourquoi cela plante si on relance ?

    Merci pour les aiguillages

  11. #11
    Expert confirmé 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

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Voici une solution de date que l'utilisateur saisie est qui fonctionne :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select c1 , c2 , c3 , c4 , sum(c5)/60 ,  TO_char(c6,'IW')
    from t1
    left join t2 on t1.c1=t2.c1
    left join t3 on t1.c3=t3.c1
    where c6 between TO_DATE('&datedeb', 'yyyymmdd') and TO_DATE('&datefin', 'yyyymmdd')
    group by c1 , c2 , c3 , c4, TO_char(c6,'IW')
    order by c1 , c3 asc ;

    Ici on supposera c1 et c3 de t1 étant des codes (clef) , c5 une durée en minute , c6 une date au format AAAAMMJJ , c2 et c4 des libellés.

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

Discussions similaires

  1. Erreur de lieur sur projet console
    Par Mercusyo dans le forum C++Builder
    Réponses: 6
    Dernier message: 23/09/2012, 14h49
  2. [Turbo Pascal] [XP SP3] Erreur au lancement sur la console
    Par Joooseph dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 06/12/2009, 14h30
  3. Erreur de type sur un code
    Par Mr T 94 dans le forum IHM
    Réponses: 6
    Dernier message: 24/02/2009, 23h47
  4. erreur de connection sur une base sql à partir de vb6
    Par diatta dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/04/2007, 13h12
  5. Réponses: 8
    Dernier message: 20/02/2006, 15h28

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