Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le script Liquibase renvoie ORA-01843 :mois non valide

'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.