sql >> Database teknologi >  >> RDS >> Oracle

Liquibase-script returnerer ORA-01843:ikke en gyldig måned

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



  1. SQL join data fra flere tabeller med MYSQL

  2. hvordan man krypterer adgangskodekolonnen

  3. Indeksering ando:GIN-indekser

  4. Rails Octopus Gem - Master-Slave Replikationsforbindelsesadfærd, når slaven er nede