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;
/