Ett datum har inget format – det lagras internt i databasen som 7-byte (representerar år, månad, dag, timme, minut och sekund) och det är inte förrän vilket användargränssnitt du än använder (t.ex. SQL/Plus, SQL Developer, Java, etc) försöker visa det för dig, användaren, och konverterar det till något du skulle tycka är meningsfullt (vanligtvis en sträng) att datumet har ett format.
Om du tillhandahåller ett formaterat datum till en procedur kommer det att vara en sträng och Oracle kommer att försöka att implicit casta det till ett datum med hjälp av NLS_DATE_FORMAT
sessionsparameter:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Konverteras implicit till
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Om NLS_DATE_FORMAT
inte matchar kommer Oracle att skapa ett undantag (och parametern kan ställas in av varje användare så du bör inte lita på att den är konsekvent - särskilt i internationella organisationer när standarddatumformatet beror på ditt territorium och ditt språk).
Om du uppdaterar värdet använd en DATE
bokstavlig och inte en sträng:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Eller konvertera uttryckligen strängen och ange formatmodellen:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Detsamma gäller för att skicka parametrar till din funktion. Använd antingen en DATE
bokstavligt:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
eller uttryckligen konvertera strängen till ett datum (och lita inte på implicit konvertering):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/