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