Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não é um mês válido em uma instrução INSERT


A menos que você tenha um gatilho na tabela que está definindo uma coluna de data ou carimbo de data/hora, o que daria alguma indicação na pilha de erros completa, parece que seu NLS_DATE_LANGUAGE não está esperando uma abreviação de mês em inglês.

O que você tem é válido em inglês:
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 

Mas se o idioma de data padrão da sua sessão for polonês (adivinhando do seu perfil), ele dará este erro - com a mensagem de erro ainda em inglês:
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 você não quiser definir sua sessão para o inglês, você pode substituir isso por uma instrução específica, fornecendo o terceiro parâmetro opcional para 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 

Você também pode evitar o problema inteiramente usando números de meses em vez de nomes de meses ou usando a sintaxe literal de carimbo de data/hora 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       

Esses métodos também funcionam para colunas de data; o to_date() A função é afetada pelas configurações de NLS da mesma maneira e tem o mesmo parâmetro de idioma de data opcional.