Датата няма формат - тя се съхранява вътрешно в базата данни като 7-байта (представляващ година, месец, ден, час, минута и секунда) и чак когато потребителският интерфейс, който използвате (т.е. SQL/Plus, SQL Developer, Java и т.н.), не се опита да го покаже на вас, потребителя, и преобразува в нещо, което бихте намерили за смислено (обикновено низ), че датата има формат.
Ако предоставяте форматирана дата на процедура, тогава тя ще бъде низ и Oracle ще се опита имплицитно да я преобразува в дата, използвайки NLS_DATE_FORMAT
параметър на сесията:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Неявно се преобразува в
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Ако NLS_DATE_FORMAT
не съвпада, тогава Oracle ще предизвика изключение (и параметърът може да бъде зададен от всеки потребител, така че не трябва да разчитате, че е последователен - особено в международни организации, когато форматът на датата по подразбиране зависи от вашата територия и език).
Ако актуализирате стойността, използвайте DATE
литерал, а не низ:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Или изрично конвертирайте низа и осигурете модела на формат:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Същото важи и за предаването на параметри към вашата функция. Или използвайте DATE
литерал:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
или изрично преобразувайте низа в дата (и не разчитайте на имплицитно преобразуване):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/