Een datum heeft geen formaat - het wordt intern in de database opgeslagen als 7-bytes (wat staat voor jaar, maand, dag, uur, minuut en seconde) en het is pas als de gebruikersinterface die u gebruikt (d.w.z. SQL/Plus, SQL Developer, Java, enz.) deze aan u, de gebruiker, probeert weer te geven en converteert het in iets dat je zinvol zou vinden (meestal een string) dat de datum een formaat heeft.
Als u een opgemaakte datum opgeeft voor een procedure, dan is het een string en zal Oracle proberen deze impliciet naar een datum te casten met behulp van de NLS_DATE_FORMAT
sessieparameter:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Wordt impliciet geconverteerd naar
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Als de NLS_DATE_FORMAT
komt niet overeen, dan zal Oracle een uitzondering maken (en de parameter kan door elke gebruiker worden ingesteld, dus u moet er niet op vertrouwen dat deze consistent is - vooral in internationale organisaties waar het standaard datumformaat afhangt van uw territorium en taal).
Als u de waarde bijwerkt, gebruik dan een DATE
letterlijk en niet een string:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Of converteer de string expliciet en geef het formaatmodel op:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Hetzelfde geldt voor het doorgeven van parameters aan uw functie. Gebruik een DATE
letterlijk:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
of converteer de string expliciet naar een datum (en vertrouw niet op impliciete conversie):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/