Retourner un intervalle dans une fonction Oracle

Dans une fonction Oracle, retourner un intervalle est plus fourbe qu’il n’y parait. De prime abord, on est tenté d’écrire la chose suivante :

CREATE OR REPLACE FUNCTION bla bla bla RETURN INTERVAL DAY TO SECOND
IS
intervalle INTERVAL DAY(9) TO SECOND(6);
BEGIN
bla bla bla
RETURN intervalle;
bla bla bla

Malheureusement ce code plante si l’intervalle en question a un nombre de jours plus élevé que 99. L’erreur est ORA-01873 « the leading precision of the interval is too small ».
Pourtant, ce n’est pas faute d’avoir défini la variable à DAY(9), soit le maximum autorisé par Oracle (pour DAY(1) on peut aller jusqu’à 9 jours, pour DAY(2) on peut aller jusqu’à 99 jours, etc.). La petite chips est située à la première ligne du code : il est écrit RETURN INTERVAL DAY TO SECOND. A cet endroit il est impossible de spécifier une précision pour les jours et les secondes, or sans spécification c’est la valeur par défaut d’un INTERVAL qui est sous-entendue par Oracle, soit DAY(2) TO SECOND (0), soit 99 jours. Et pas de chance, c’est cette précision qui prime sur la précision écrite dans la suite du code.

Pour corriger le problème, il ne faut pas faire RETURN INTERVAL DAY TO SECOND, mais RETURN DSINTERVAL_UNCONSTRAINED

Tadaaaaa !!

Une réflexion au sujet de « Retourner un intervalle dans une fonction Oracle »

Répondre à Ninette Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>