Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-1843:kein gültiger Monat beim Aktualisieren des Datensatzes

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

umgewandelt
UPDATE 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;
/