'02.01.15 12:00:00'
n'est pas une date, c'est une chaîne ; si vous essayez de l'insérer dans une DATE
colonne de type de données, Oracle essaiera de la convertir en une date en utilisant l'équivalent de :
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Donc, si votre NLS_DATE_FORMAT
le paramètre de session ne correspond pas au format de votre chaîne '02.01.15 12:00:00'
alors il lèvera une exception - et c'est ce qui semble se produire puisque vous obtenez ORA-01843: not a valid month
.
La meilleure solution consiste à modifier votre script pour convertir explicitement la chaîne en une date :
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;
ou pour utiliser un littéral d'horodatage :TIMESTAMP '2015-01-02 12:00:00'
Mais vous pouvez également créer un déclencheur de connexion pour modifier le NLS_DATE_FORMAT
paramètre de session. Enroulez le déclencheur autour de ce code :
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Cependant, cela modifiera le format de date utilisé dans toutes les conversions implicites de chaîne en date (et vice versa) et peut donc casser d'autres requêtes qui reposent également sur ces conversions implicites. De plus, chaque utilisateur peut modifier ses paramètres de session à tout moment. Par conséquent, la définition de cette valeur par défaut lors de la connexion implique qu'il ne la modifie jamais pendant sa session.
[TL;DR] Corrigez votre script pour ne pas utiliser de conversions implicites entre les types de données plutôt que de modifier le modèle de format utilisé pour les conversions implicites.