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

ORA-1843:neplatný měsíc při aktualizaci záznamu

Datum nemá formát – je uloženo interně v databázi jako 7bajtů (představující rok, měsíc, den, hodinu, minutu a sekundu) a není to dokud jakékoli uživatelské rozhraní, které používáte (tj. SQL/Plus, SQL Developer, Java atd.), se pokusí zobrazit vám, uživateli, a převede to do něčeho, co byste považovali za smysluplné (obvykle řetězec), že datum má formát.

Pokud poskytujete proceduře formátované datum, bude to řetězec a Oracle se jej pokusí implicitně přetypovat na datum pomocí NLS_DATE_FORMAT parametr relace:

UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter

Je implicitně převedeno na

UPDATE your_table
SET your_date_column = TO_DATE(
                         '18-06-14',
                         ( SELECT value
                           FROM   NLS_SESSION_PARAMETERS
                           WHERE  parameter = 'NLS_DATE_FORMAT' )
                       );

Pokud NLS_DATE_FORMAT neodpovídá, pak Oracle vyvolá výjimku (a parametr si může nastavit každý uživatel, takže byste se neměli spoléhat na to, že bude konzistentní – zvláště v mezinárodních organizacích, kdy výchozí formát data závisí na vašem území a jazyce).

Pokud aktualizujete hodnotu, použijte DATE doslovný a ne řetězec:

UPDATE your_table
SET your_date_column = DATE '2014-06-18';

Nebo explicitně převeďte řetězec a uveďte model formátu:

UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );

Totéž platí pro předávání parametrů vaší funkci. Buď použijte DATE doslovné:

BEGIN
  your_procedure(
    p_launch_date => DATE '2014-06-18'
  );
END;
/

nebo explicitně převést řetězec na datum (a nespoléhat se na implicitní převod):

BEGIN
  your_procedure(
    p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
  );
END;
/



  1. ORA-30926 - Stav sloučení

  2. ListArray Ukládání stejných záznamů

  3. MYSQL - Získejte všechny záznamy, které mají více než 1 záznam pro stejné ID

  4. Oracle odstraňuje duplikáty na základě podmínky