sql >> Databáze >  >> RDS >> Oracle

Skript Liquibase vrací ORA-01843:neplatný měsíc

'02.01.15 12:00:00' není datum, je to řetězec; pokud se jej pokoušíte vložit do DATE datový typ, pak se Oracle pokusí přetypovat na datum pomocí ekvivalentu:

SELECT TO_DATE(
         '02.01.15 12:00:00',
         ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
       ) as CHANGED
FROM   DUAL

Pokud tedy váš NLS_DATE_FORMAT parametr session neodpovídá formátu vašeho řetězce '02.01.15 12:00:00' pak vyvolá výjimku – a to je to, co se zřejmě děje, protože dostáváte ORA-01843: not a valid month .

Nejlepším řešením je upravit skript tak, aby explicitně přetypoval řetězec na datum:

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;

nebo použít literál časového razítka:TIMESTAMP '2015-01-02 12:00:00'

Můžete však také vytvořit spouštěč přihlášení a změnit NLS_DATE_FORMAT parametr relace. Omotejte spoušť kolem tohoto kódu:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';

Tím se však změní formát data používaný ve všech implicitních převodech z řetězce na datum (a naopak), takže může dojít k přerušení jiných dotazů, které také spoléhají na takové implicitní převody. Každý uživatel může také kdykoli změnit své parametry relace, takže nastavení tohoto výchozího nastavení při přihlášení spoléhá na to, že je během relace nikdy nezmění.

[TL;DR] Opravte svůj skript tak, aby nepoužíval implicitní převody mezi datovými typy místo úpravy modelu formátu používaného pro implicitní převody.



  1. naplnit dva spinnery z databáze mysql, které jsou na sobě závislé

  2. Generování entit pro jednu tabulku

  3. Jak získat hodnoty oddělené čárkami z databáze

  4. Mám zacházet s GraphQL ID jako s řetězcem na klientovi?