sql >> Base de Datos >  >> RDS >> Oracle

El script de Liquibase devuelve ORA-01843:no es un mes válido

'02.01.15 12:00:00' no es una fecha es una cadena; si está tratando de insertarlo en un DATE columna de tipo de datos, Oracle intentará convertirlo en una fecha usando el equivalente de:

SELECT TO_DATE(
         '02.01.15 12:00:00',
         ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
       ) as CHANGED
FROM   DUAL

Entonces, si su NLS_DATE_FORMAT El parámetro de sesión no coincide con el formato de su cadena '02.01.15 12:00:00' entonces generará una excepción, y esto es lo que parece suceder ya que está obteniendo ORA-01843: not a valid month .

La mejor solución es modificar su secuencia de comandos para convertir explícitamente la cadena en una fecha:

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;

o para usar un literal de marca de tiempo:TIMESTAMP '2015-01-02 12:00:00'

Pero también podría crear un activador de inicio de sesión para cambiar el NLS_DATE_FORMAT parámetro de sesión. Envuelva el gatillo alrededor de este código:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';

Sin embargo, esto cambiará el formato de fecha utilizado en todas las conversiones implícitas de cadena a fecha (y viceversa), por lo que puede interrumpir otras consultas que también dependen de dichas conversiones implícitas. Además, cada usuario puede cambiar sus parámetros de sesión en cualquier momento, por lo que configurar este valor predeterminado al iniciar sesión depende de que nunca lo cambien durante su sesión.

[TL;RD] Corrija su secuencia de comandos para que no utilice conversiones implícitas entre tipos de datos en lugar de modificar el modelo de formato utilizado para las conversiones implícitas.