Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-1843:mese non valido durante l'aggiornamento del record

Una data non ha un formato:viene archiviata internamente nel database come 7 byte (che rappresentano anno, mese, giorno, ora, minuti e secondi) e non è fino a quando l'interfaccia utente che stai utilizzando (ad esempio SQL/Plus, SQL Developer, Java, ecc.) non tenta di mostrarlo a te, all'utente e converte in qualcosa che potresti trovare significativo (di solito una stringa) che la data abbia un formato.

Se stai fornendo una data formattata a una procedura, sarà una stringa e Oracle tenterà di eseguirne il cast implicito in una data utilizzando NLS_DATE_FORMAT parametro di sessione:

UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter

Viene convertito in modo implicito in

UPDATE your_table
SET your_date_column = TO_DATE(
                         '18-06-14',
                         ( SELECT value
                           FROM   NLS_SESSION_PARAMETERS
                           WHERE  parameter = 'NLS_DATE_FORMAT' )
                       );

Se il NLS_DATE_FORMAT non corrisponde, Oracle solleverà un'eccezione (e il parametro può essere impostato da ciascun utente, quindi non dovresti fare affidamento sulla sua coerenza, specialmente nelle organizzazioni internazionali quando il formato della data predefinito dipende dal tuo territorio e dalla tua lingua).

Se stai aggiornando il valore, usa un DATE letterale e non una stringa:

UPDATE your_table
SET your_date_column = DATE '2014-06-18';

Oppure converti esplicitamente la stringa e fornisci il modello di formato:

UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );

Lo stesso vale per il passaggio di parametri alla tua funzione. Usa un DATE letterale:

BEGIN
  your_procedure(
    p_launch_date => DATE '2014-06-18'
  );
END;
/

o convertire esplicitamente la stringa in una data (e non fare affidamento sulla conversione implicita):

BEGIN
  your_procedure(
    p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
  );
END;
/