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

O script Liquibase retorna ORA-01843:não é um mês válido


'02.01.15 12:00:00' não é uma data é uma string; se você estiver tentando inseri-lo em um DATE coluna de tipo de dados, o Oracle tentará convertê-lo em uma data usando o equivalente a:
SELECT TO_DATE(
         '02.01.15 12:00:00',
         ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
       ) as CHANGED
FROM   DUAL

Portanto, se seu NLS_DATE_FORMAT O parâmetro de sessão não corresponde ao formato da sua string '02.01.15 12:00:00' então ele irá gerar uma exceção - e isso é o que parece acontecer, pois você está recebendo ORA-01843: not a valid month .

A melhor solução é modificar seu script para converter explicitamente a string em uma data:
MERGE INTO A config
USING (
  SELECT 100 as id,
         TO_DATE( '02.01.15 12:00:00', 'DD.MM.YY HH24:MI:SS' ) as CHANGED,
         0 as DELETED,
         1 as B
  FROM   DUAL
) src ON (src.id = config.id)
WHEN NOT MATCHED THEN 
  INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
WHEN MATCHED THEN
  UPDATE SET config.B = src.B;

ou para usar um literal de carimbo de data/hora:TIMESTAMP '2015-01-02 12:00:00'

Mas você também pode criar um gatilho de logon para alterar o NLS_DATE_FORMAT parâmetro de sessão. Enrole o gatilho em torno deste código:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';

No entanto, isso alterará o formato de data usado em todas as conversões implícitas de string para data (e vice-versa), podendo interromper outras consultas que também dependem dessas conversões implícitas. Além disso, cada usuário pode alterar seus parâmetros de sessão a qualquer momento, portanto, definir esse padrão no logon depende de que eles nunca o alterem durante a sessão.

[TL;DR] Corrija seu script para não usar conversões implícitas entre tipos de dados em vez de modificar o modelo de formato usado para conversões implícitas.