'02.01.15 12:00:00'
non è una data è una stringa; se stai cercando di inserirlo in un DATE
colonna del tipo di dati, Oracle proverà a eseguirne il cast a una data utilizzando l'equivalente di:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Quindi, se il tuo NLS_DATE_FORMAT
il parametro di sessione non corrisponde al formato della tua stringa '02.01.15 12:00:00'
quindi solleverà un'eccezione - e questo è ciò che sembra accadere poiché stai ricevendo ORA-01843: not a valid month
.
La soluzione migliore è modificare lo script per eseguire il cast esplicito della stringa su una data:
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;
o per utilizzare un timestamp letterale:TIMESTAMP '2015-01-02 12:00:00'
Ma potresti anche creare un attivatore di accesso per modificare NLS_DATE_FORMAT
parametro di sessione. Avvolgi il trigger attorno a questo codice:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Tuttavia, questo cambierà il formato della data utilizzato in tutte le conversioni implicite da stringa a data (e viceversa), quindi potrebbe interrompere altre query che si basano anche su tali conversioni implicite. Inoltre, ogni utente può modificare i propri parametri di sessione in qualsiasi momento, quindi l'impostazione di questo valore predefinito all'accesso si basa sul fatto che non lo cambino mai durante la sessione.
[TL;DR] Correggi lo script in modo che non utilizzi conversioni implicite tra tipi di dati anziché modificare il modello di formato utilizzato per le conversioni implicite.