'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:
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.