En dato har ikke et format - den gemmes internt i databasen som 7-bytes (repræsenterer år, måned, dag, time, minut og sekund), og det er ikke før hvilken brugergrænseflade du bruger (dvs. SQL/Plus, SQL Developer, Java osv.) forsøger at vise den til dig, brugeren, og konverterer det til noget, du ville finde meningsfuldt (normalt en streng), at datoen har et format.
Hvis du angiver en formateret dato til en procedure, vil det være en streng, og Oracle vil forsøge implicit at caste den til en dato ved hjælp af NLS_DATE_FORMAT
sessionsparameter:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Er implicit konverteret til
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Hvis NLS_DATE_FORMAT
ikke matcher, vil Oracle rejse en undtagelse (og parameteren kan indstilles af hver bruger, så du bør ikke stole på, at den er konsistent - især i internationale organisationer, hvor standarddatoformatet afhænger af dit territorium og dit sprog).
Hvis du opdaterer værdien, skal du bruge en DATE
bogstaveligt og ikke en streng:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Eller konverter strengen eksplicit og angiv formatmodellen:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Det samme gælder for at overføre parametre til din funktion. Brug enten en DATE
bogstaveligt:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
eller eksplicit konverter strengen til en dato (og stol ikke på implicit konvertering):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/