Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Das Liquibase-Skript gibt ORA-01843 zurück:kein gültiger Monat

'02.01.15 12:00:00' ist kein Datum, sondern ein String; wenn Sie versuchen, es in ein DATE einzufügen Datentyp-Spalte, dann versucht Oracle, sie mit dem Äquivalent von:

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

Wenn also Ihr NLS_DATE_FORMAT Der Sitzungsparameter stimmt nicht mit dem Format Ihrer Zeichenfolge '02.01.15 12:00:00' überein dann wird es eine Ausnahme auslösen - und das scheint zu passieren, da Sie ORA-01843: not a valid month erhalten .

Die beste Lösung besteht darin, Ihr Skript so zu ändern, dass die Zeichenfolge explizit in ein Datum umgewandelt wird:

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;

oder um ein Zeitstempel-Literal zu verwenden:TIMESTAMP '2015-01-02 12:00:00'

Sie könnten aber auch einen Anmeldetrigger erstellen, um das NLS_DATE_FORMAT zu ändern Sitzungsparameter. Wickeln Sie den Trigger um diesen Code:

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

Dadurch wird jedoch das Datumsformat geändert, das bei allen impliziten Konvertierungen von Zeichenfolge in Datum (und umgekehrt) verwendet wird, sodass andere Abfragen möglicherweise beschädigt werden, die ebenfalls auf solchen impliziten Konvertierungen beruhen. Außerdem kann jeder Benutzer seine Sitzungsparameter jederzeit ändern, so dass das Festlegen dieser Standardeinstellung beim Anmelden darauf angewiesen ist, dass er sie während seiner Sitzung nie ändert.

[TL;DR] Korrigieren Sie Ihr Skript so, dass es keine impliziten Konvertierungen zwischen Datentypen verwendet, anstatt das für implizite Konvertierungen verwendete Formatmodell zu ändern.