Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-1843 :pas un mois valide lors de la mise à jour de l'enregistrement

Une date n'a pas de format - elle est stockée en interne dans la base de données sous la forme 7 octets (représentant l'année, le mois, le jour, l'heure, la minute et la seconde) et ce n'est que lorsque l'interface utilisateur que vous utilisez (c'est-à-dire SQL/Plus, SQL Developer, Java, etc.) essaie de l'afficher pour vous, l'utilisateur, et convertit en quelque chose que vous trouveriez significatif (généralement une chaîne) que la date a un format.

Si vous fournissez une date formatée à une procédure, ce sera une chaîne et Oracle essaiera implicitement de la convertir en une date en utilisant le NLS_DATE_FORMAT paramètre de session :

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

Est implicitement converti en

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

Si le NLS_DATE_FORMAT ne correspond pas, Oracle déclenchera une exception (et le paramètre peut être défini par chaque utilisateur, vous ne devez donc pas compter sur sa cohérence, en particulier dans les organisations internationales lorsque le format de date par défaut dépend de votre territoire et de votre langue).

Si vous mettez à jour la valeur, utilisez une DATE littéral et non une chaîne :

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

Ou convertissez explicitement la chaîne et fournissez le modèle de format :

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

Il en va de même pour le passage de paramètres à votre fonction. Soit utiliser une DATE littéral :

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

ou convertissez explicitement la chaîne en une date (et ne comptez pas sur la conversion implicite) :

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