'02.01.15 12:00:00'
to nie data to ciąg znaków; jeśli próbujesz wstawić go do DATE
kolumna typu danych, Oracle spróbuje rzutować ją na datę, używając odpowiednika:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Więc jeśli Twój NLS_DATE_FORMAT
parametr sesji nie pasuje do formatu ciągu '02.01.15 12:00:00'
wtedy zgłosi wyjątek - i wydaje się, że tak się dzieje, ponieważ otrzymujesz ORA-01843: not a valid month
.
Najlepszym rozwiązaniem jest zmodyfikowanie skryptu tak, aby jawnie rzutował ciąg na datę:
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;
lub użyć literału znacznika czasu:TIMESTAMP '2015-01-02 12:00:00'
Ale możesz również utworzyć wyzwalacz logowania, aby zmienić NLS_DATE_FORMAT
parametr sesji. Owiń wyzwalacz wokół tego kodu:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Spowoduje to jednak zmianę formatu daty używanego we wszystkich niejawnych konwersjach z ciągu na datę (i odwrotnie), więc może przerwać inne zapytania, które również opierają się na takich niejawnych konwersjach. Ponadto każdy użytkownik może zmienić swoje parametry sesji w dowolnym momencie, więc ustawienie tej wartości domyślnej przy logowaniu polega na tym, że nigdy nie zmienią go podczas sesji.
[TL;DR] Napraw swój skrypt, aby nie używał niejawnych konwersji między typami danych, zamiast modyfikować model formatu używany do niejawnych konwersji.