Ein Datum hat kein Format – es wird intern in der Datenbank als 7-Byte gespeichert (repräsentiert Jahr, Monat, Tag, Stunde, Minute und Sekunde) und erst dann, wenn die von Ihnen verwendete Benutzeroberfläche (z. B. SQL/Plus, SQL Developer, Java usw.) versucht, sie Ihnen, dem Benutzer, anzuzeigen und konvertiert es in etwas Sinnvolles umzuwandeln (normalerweise eine Zeichenkette), dass das Datum ein Format hat.
Wenn Sie einer Prozedur ein formatiertes Datum bereitstellen, handelt es sich um eine Zeichenfolge, und Oracle versucht, es mithilfe von NLS_DATE_FORMAT
implizit in ein Datum umzuwandeln Sitzungsparameter:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Wird implizit in
umgewandeltUPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Wenn das NLS_DATE_FORMAT
nicht übereinstimmt, löst Oracle eine Ausnahme aus (und der Parameter kann von jedem Benutzer festgelegt werden, sodass Sie sich nicht darauf verlassen sollten, dass er konsistent ist – insbesondere in internationalen Organisationen, wenn das standardmäßige Datumsformat von Ihrem Gebiet und Ihrer Sprache abhängt).
Wenn Sie den Wert aktualisieren, verwenden Sie ein DATE
Literal und kein String:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Oder konvertieren Sie die Zeichenfolge explizit und geben Sie das Formatmodell an:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Dasselbe gilt für die Übergabe von Parametern an Ihre Funktion. Verwenden Sie entweder ein DATE
wörtlich:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
oder konvertieren Sie die Zeichenfolge explizit in ein Datum (und verlassen Sie sich nicht auf die implizite Konvertierung):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/