Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pas un mois valide sur une instruction INSERT

À moins que vous n'ayez un déclencheur sur la table qui définit une colonne de date ou d'horodatage, ce qui donnerait une indication dans la pile d'erreurs complète, cela ressemble à votre NLS_DATE_LANGUAGE n'attend pas d'abréviation de mois en anglais.

Ce que vous avez est valide en anglais :

alter session set nls_timestamp_format = 'RR/MM/DD HH24:MI:SSXFF';
alter session set nls_date_language ='ENGLISH';

select to_timestamp('15-APR-14 01.36.58.803000000 PM',
  'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;

MY_DATE                   
---------------------------
14/04/15 13:36:58.803000000 

Mais si la langue de date par défaut de votre session est le polonais (devinant à partir de votre profil), cela donnera cette erreur - avec le message d'erreur toujours en anglais :

alter session set nls_date_language ='POLISH';

select to_timestamp('15-APR-14 01.36.58.803000000 PM',
  'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;

SQL Error: ORA-01843: not a valid month
01843. 00000 -  "not a valid month"

Si vous ne souhaitez pas définir votre session en anglais, vous pouvez remplacer cela pour une instruction spécifique en donnant le troisième paramètre facultatif à to_timestamp() :

alter session set nls_date_language ='POLISH';

select to_timestamp('15-APR-14 01.36.58.803000000 PM',
  'DD-MON-RR HH.MI.SS.FF AM',
  'NLS_DATE_LANGUAGE=ENGLISH') as my_date
from dual;

MY_DATE                   
---------------------------
14/04/15 13:36:58.803000000 

Vous pouvez également éviter complètement le problème en utilisant des numéros de mois au lieu de noms de mois, ou en utilisant la syntaxe littérale d'horodatage ANSI :

select timestamp '2014-04-15 13:36:58.803' from dual;

TIMESTAMP'2014-04-1513:36:58.803'
---------------------------------
14/04/15 13:36:58.803000000       

Ces méthodes fonctionnent également toutes pour les colonnes de date; le to_date() La fonction est affectée par les paramètres NLS de la même manière et a le même paramètre de langue de date facultatif.