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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    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 Expert 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 : 38
    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
    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.

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    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 Expert 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 : 38
    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
    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.

  5. #5
    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
    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 Expert 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 : 38
    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
    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.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    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.

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