'02.01.15 12:00:00'
er ikke en dato, det er en streng; hvis du forsøger at indsætte det i en DATE
datatype kolonne, så vil Oracle forsøge at caste den til en dato ved at bruge det, der svarer til:
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å hvis din NLS_DATE_FORMAT
sessionsparameteren matcher ikke formatet på din streng '02.01.15 12:00:00'
så vil det rejse en undtagelse - og det er det, der ser ud til at ske, da du får ORA-01843: not a valid month
.
Den bedste løsning er at ændre dit script til eksplicit at caste strengen til en dato:
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 for at bruge et tidsstempel:TIMESTAMP '2015-01-02 12:00:00'
Men du kan også oprette en logon-trigger for at ændre NLS_DATE_FORMAT
sessionsparameter. Sæt triggeren rundt om denne kode:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Dette vil dog ændre datoformatet, der bruges i alle implicitte konverteringer fra streng til dato (og omvendt), så det kan bryde andre forespørgsler, der også er afhængige af sådanne implicitte konverteringer. Hver bruger kan også ændre deres sessionsparametre til enhver tid, så indstilling af denne standard ved log på afhænger af, at de aldrig ændrer den under deres session.
[TL;DR] Ret dit script til ikke at bruge implicitte konverteringer mellem datatyper i stedet for at ændre formatmodellen, der bruges til implicitte konverteringer.