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

PL/SQL Oracle Discussion :

ORA-01843: not a valid month


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut ORA-01843: not a valid month
    Bonjour à tous,

    J'ai une procédure sur deux bases différentes (TEST et PROD) qui prend une date en paramètre.

    Cette procédure est identique sur les deux environnement.

    Cependant lorsque je fais des tests, la procédure fonctionne sans problème sur l'environnement de TEST. Toutefois sur l'environnement de PROD, à l'exécution, j'ai l'erreur :
    ORA-01843: not a valid month
    .

    J'ai vérifié les paramètres des deux bases :

    - Base de Test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM NLS_DATABASE_PARAMETERS;
    Voici le résultat :

    PARAMETER	VALUE
    
    NLS_NCHAR_CHARACTERSET	AL16UTF16
    NLS_LANGUAGE	FRENCH
    NLS_TERRITORY	FRANCE
    NLS_CURRENCY	?
    NLS_ISO_CURRENCY	FRANCE
    NLS_NUMERIC_CHARACTERS	,.
    NLS_CHARACTERSET	WE8ISO8859P1
    NLS_CALENDAR	GREGORIAN
    NLS_DATE_FORMAT	DD/MM/RR
    NLS_DATE_LANGUAGE	FRENCH
    NLS_SORT	FRENCH
    NLS_TIME_FORMAT	HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT	DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT	DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY	?
    NLS_COMP	BINARY
    NLS_LENGTH_SEMANTICS	BYTE
    NLS_NCHAR_CONV_EXCP	FALSE
    NLS_RDBMS_VERSION	9.2.0.8.0
    - Sur la PROD :

    PARAMETER	VALUE
    
    NLS_NCHAR_CHARACTERSET	AL16UTF16
    NLS_LANGUAGE	FRENCH
    NLS_TERRITORY	FRANCE
    NLS_CURRENCY	?
    NLS_ISO_CURRENCY	FRANCE
    NLS_NUMERIC_CHARACTERS	,.
    NLS_CHARACTERSET	WE8ISO8859P1
    NLS_CALENDAR	GREGORIAN
    NLS_DATE_FORMAT	DD/MM/RR
    NLS_DATE_LANGUAGE	FRENCH
    NLS_SORT	FRENCH
    NLS_TIME_FORMAT	HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT	DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT	DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY	?
    NLS_COMP	BINARY
    NLS_LENGTH_SEMANTICS	BYTE
    NLS_NCHAR_CONV_EXCP	FALSE
    NLS_RDBMS_VERSION	9.2.0.8.0
    Le résultat est le même.

    De ce fait je ne comprends pas d'où vient le problème.

    Si quelqu'un a une idée je suis preneur

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Il détecte un mois invalide genre 10/13/2012. Soit une erreur est présente dans tes données soit tu définis mal tes dates dans ta procédure.

    Montre-nous donc ta procédure, tes tables et un extrait de données.
    ~ Lola ~

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    J'ai oublié de donner un exemple c'est vrai :

    Ma procédure à un paramètre date en entrée.

    J'ai constaté que si je fait appel à ma procédure sur l'environnement de PROD avec une date au format français type DD/MM/YYYY (ex: 01/01/2005), je me retrouve avec l'erreur => not a valid month.
    Si j'appelle ma procédure avec le format américain (ex: 01-jan-2005) la procédure s'exécute.

    Si je fais les mêmes appels sur l'environnement de TEST la procédure s'exécute et le format stocké en base correspond au format français.

    Voici la déclaration de ma procédure et les exemples d'appels fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure UpdateDateNomenclature(par_dDeb In DATE)
    UpdateDateNomenclature('01-JAN-2005');
    UpdateDateNomenclature('01/01/2005');
    Il y a t'il un autre endroit que la table NLS_DATABASE_PARAMETERS où le format de date par défaut d'oracle peut-être paramétré?

  4. #4
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Dans ta procédure tu peux reformater ta date avant de faire des calculs.

    Quand je demandais ta procédure, c'est pas juste la déclaration ou les appels mais la procédure en elle-même.
    ~ Lola ~

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Pour être certain de la manière dont ta chaîne de caractères est convertie en date, le plus simple est de forcer le format en utilisant TO_DATE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure UpdateDateNomenclature(par_dDeb IN DATE)
    UpdateDateNomenclature(TO_DATE('01-JAN-2005', 'dd-mmm-yyyy'));
    UpdateDateNomenclature(TO_DATE('01/01/2005', 'dd/mm/yyyy'));
    En évitant les conversions implicites, tu es sur de ne pas avoir de surprise !
    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.

  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Pour être certain de la manière dont ta chaîne de caractères est convertie en date, le plus simple est de forcer le format en utilisant TO_DATE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure UpdateDateNomenclature(par_dDeb IN DATE)
    UpdateDateNomenclature(TO_DATE('01-JAN-2005', 'dd-mmm-yyyy'));
    UpdateDateNomenclature(TO_DATE('01/01/2005', 'dd/mm/yyyy'));
    En évitant les conversions implicites, tu es sur de ne pas avoir de surprise !
    N'est-ce pas mieux de reformater la date dans la procédure ?
    Cela éviterai de reconvertir à chaque fois qu'elle est appelée.
    ~ Lola ~

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par lola06 Voir le message
    N'est-ce pas mieux de reformater la date dans la procédure ?
    Cela éviterai de reconvertir à chaque fois qu'elle est appelée.
    La procédure traite une date et une date n'a pas de format, il n'y a donc rien à faire dans la procédure.
    Par contre '01/01/2005' n'est pas une date mais un varchar, il y aura donc conversion implicite.
    TO_DATE('01/01/2005', 'dd/mm/yyyy') est une date, pas de conversion implicite dans la procédure.

    La bonne méthode d'appel de la procédure est donc bien celle donnée par Al1_24.

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    D'ailleurs, il faut toujours préciser le format des dates qui sont saisies en varchar, pour la transportabilité du code, et surtout pour éviter ce genre d'erreurs.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci pour vos différents retours.

    Dans l'absolu, je suis tout à fait d'accord avec vous sur la précision du format de date en entrée.

    Toutefois la difficulté c'est que l'appel à ma procédure est fait par un programme tiers géré par un autre éditeur. Ce programme est à la base codé en JAVA. Ils récupèrent sous forme d'une chaîne la liste des paramètres et à l'aide d'un concentrateur appel ma procédure.

    Tous les appels à mes différentes procédure se font de la même façon. Et il n'y a que sur une proc que le problème se produit.

    En tout cas merci de vos divers retours.

  10. #10
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Points : 17 036
    Points
    17 036
    Par défaut
    Bonjour,

    Donc, personne ne saurait dire ce qui fait que le comportement diffère, entre la prod et le test, alors que la configuration NLS est conforme ?

    Si du moment que le paramétrage NLS est conforme et que par rapport à Oracle il ne peut pas y avoir d'autre endroit où un paramétrage pourrait jouer, alors c'est que ça vient soit de l'OS, soit de l'environnement Java... mais où ?
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ca n'a rien à voir avec un paramétrage de la base de données, mais c'est lié à un paramétrage de la session de l'utilisateur qui se connecte.
    Effectivement des paramétrages java, OS, NLS_LANG... côté client influent sur le paramétrage de la session.

    Décrivez-votre problème si vous souhaitez des réponses plus adaptées.

  12. #12
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Points : 17 036
    Points
    17 036
    Par défaut
    Merci de ta réponse.

    Mon problème semble parfaitement similaire à celui énoncé au départ, je ne vois pas trop quoi y ajouter.

    Habituellement, l'application concernée (une webapp sous Tomcat) fonctionne bien chez les clients, en revanche, chez un nouveau client, on a une erreur ORA-01843. Ceci n'est pas étonnant car le format des dates fournies en paramètre des requêtes n'a pas été précisé (pas d'utilisation de TO_DATE()). De fait, une conversion automatique texte -> date est effectuée mais sur un format qui n'est pas le bon.

    Là on cherche à identifier à quel niveau l'environnement diffère et interfère dans le format des dates transmises via JDBC, à la base Oracle (qui elle, vraisemblablement, est bien configurée)...

    Dans l'absolu, je sais qu'un alter session ou l'ajout du to_date serait préférable mais en pratique on préfère éviter d'en arriver là, pour différentes raisons.
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Le NLS_DATE_FORMAT est issu du NLS_TERITORY.

    Une approche est de trouver les locales java qui permettent de configurer le NLS_TERITORY
    Exemple :
    https://stackoverflow.com/questions/...bc-thin-driver

    Sinon une autre possibilité est de créer un trigger after logon afin de configurer le NLS_DATE_FORMAT avec la bonne valeur.

  14. #14
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Points : 17 036
    Points
    17 036
    Par défaut
    Donc, effectivement, il suffisait d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Duser.country=fr -Duser.language=fr
    dans la config Tomcat (le paramétrage du service en ce qui me concerne).
    Merci
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

Discussions similaires

  1. [11g] Erreur : Not a valid month error (ORA-1843)
    Par jérémyp8 dans le forum Oracle
    Réponses: 4
    Dernier message: 28/11/2013, 17h32
  2. [11gR2] select error ora-01843 not a valid month
    Par jacko842 dans le forum Débuter
    Réponses: 1
    Dernier message: 08/04/2013, 13h49
  3. [Débutant] ORA-01843 NOT A VALID MONTH avec mon insert
    Par jacko842 dans le forum ADO.NET
    Réponses: 7
    Dernier message: 20/10/2012, 10h45
  4. Réponses: 6
    Dernier message: 10/06/2011, 13h57
  5. Not a valid month ? ?
    Par szdavid dans le forum Oracle
    Réponses: 22
    Dernier message: 16/01/2006, 16h55

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