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

Lo script Liquibase restituisce ORA-01843:mese non valido

'02.01.15 12:00:00' non è una data è una stringa; se stai cercando di inserirlo in un DATE colonna del tipo di dati, Oracle proverà a eseguirne il cast a una data utilizzando l'equivalente di:

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

Quindi, se il tuo NLS_DATE_FORMAT il parametro di sessione non corrisponde al formato della tua stringa '02.01.15 12:00:00' quindi solleverà un'eccezione - e questo è ciò che sembra accadere poiché stai ricevendo ORA-01843: not a valid month .

La soluzione migliore è modificare lo script per eseguire il cast esplicito della stringa su una 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;

o per utilizzare un timestamp letterale:TIMESTAMP '2015-01-02 12:00:00'

Ma potresti anche creare un attivatore di accesso per modificare NLS_DATE_FORMAT parametro di sessione. Avvolgi il trigger attorno a questo codice:

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

Tuttavia, questo cambierà il formato della data utilizzato in tutte le conversioni implicite da stringa a data (e viceversa), quindi potrebbe interrompere altre query che si basano anche su tali conversioni implicite. Inoltre, ogni utente può modificare i propri parametri di sessione in qualsiasi momento, quindi l'impostazione di questo valore predefinito all'accesso si basa sul fatto che non lo cambino mai durante la sessione.

[TL;DR] Correggi lo script in modo che non utilizzi conversioni implicite tra tipi di dati anziché modificare il modello di formato utilizzato per le conversioni implicite.