'02.01.15 12:00:00'
är inte ett datum det är en sträng; om du försöker infoga den i en DATE
datatyp kolumn så kommer Oracle att försöka casta den till ett datum med motsvarande:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Så om din NLS_DATE_FORMAT
sessionsparametern matchar inte formatet för din sträng '02.01.15 12:00:00'
då kommer det att skapa ett undantag - och det här är vad som verkar hända eftersom du får ORA-01843: not a valid month
.
Den bästa lösningen är att modifiera ditt skript för att explicit casta strängen till ett datum:
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;
eller för att använda en bokstavlig tidsstämpel:TIMESTAMP '2015-01-02 12:00:00'
Men du kan också skapa en inloggningsutlösare för att ändra NLS_DATE_FORMAT
sessionsparameter. Linda utlösaren runt den här koden:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Detta kommer dock att ändra datumformatet som används i alla implicita omvandlingar från sträng till datum (och vice versa) så kan bryta andra frågor som också är beroende av sådana implicita omvandlingar. Dessutom kan varje användare ändra sina sessionsparametrar när som helst så att ställa in denna standard vid inloggning förlitar sig på att de aldrig ändrar det under sin session.
[TL;DR] Fixa ditt skript så att det inte använder implicita omvandlingar mellan datatyper snarare än att ändra formatmodellen som används för implicita omvandlingar.