Oracle
 sql >> Database >  >> RDS >> Oracle

Mese non valido su un'istruzione INSERT

A meno che tu non abbia un trigger sulla tabella che sta impostando una colonna data o timestamp, che darebbe qualche indicazione nello stack di errori completo, suona come il tuo NLS_DATE_LANGUAGE non si aspetta un'abbreviazione del mese in lingua inglese.

Quello che hai è valido in inglese:

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 

Ma se la lingua della data predefinita della tua sessione è il polacco (indovinando dal tuo profilo), visualizzerà questo errore - con il messaggio di errore ancora in inglese:

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"

Se non vuoi impostare la tua sessione in inglese, puoi sovrascriverla per un'istruzione specifica dando il terzo parametro facoltativo a 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 

Puoi anche evitare del tutto il problema utilizzando i numeri dei mesi anziché i nomi dei mesi o utilizzando la sintassi letterale del timestamp 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       

Questi metodi funzionano anche per le colonne della data; il to_date() la funzione è influenzata dalle impostazioni NLS allo stesso modo e ha lo stesso parametro opzionale della lingua della data.