Data nie ma formatu – jest przechowywana wewnętrznie w bazie danych jako 7-bajtów (reprezentujące rok, miesiąc, dzień, godzinę, minutę i sekundę) i dopiero wtedy, gdy używany interfejs użytkownika (tj. SQL/Plus, SQL Developer, Java itp.) nie spróbuje go wyświetlić użytkownikowi i dokona konwersji w coś, co uznasz za sensowne (zazwyczaj ciąg), że data ma format.
Jeśli podajesz sformatowaną datę do procedury, będzie to ciąg i Oracle spróbuje niejawnie rzutować ją na datę, używając NLS_DATE_FORMAT
parametr sesji:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Jest domyślnie konwertowane na
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Jeśli NLS_DATE_FORMAT
nie pasuje, Oracle zgłosi wyjątek (a parametr może być ustawiony przez każdego użytkownika, więc nie powinieneś polegać na tym, że jest spójny - szczególnie w organizacjach międzynarodowych, gdy domyślny format daty zależy od twojego terytorium i języka).
Jeśli aktualizujesz wartość, użyj DATE
literał, a nie ciąg:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Lub jawnie przekonwertuj ciąg i podaj model formatu:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
To samo dotyczy przekazywania parametrów do funkcji. Użyj DATE
dosłowny:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
lub jawnie przekonwertuj ciąg na datę (i nie polegaj na niejawnej konwersji):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/