Dba random number
| Fiche express | |
|---|---|
| Type | Script SQL*Plus utilitaire |
| Domaine | Administration (utilitaire SQL) |
Dba random number génère un nombre pseudo-aléatoire en pur SQL, sans fonction PL/SQL dédiée, en dérivant une valeur à partir de l'heure courante (nombre de secondes écoulées depuis minuit).
Script
SELECT
TRUNC(
(TO_NUMBER(SUBSTR(TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE, 'sssss')) / 86399), -7, 7)) / 10000000) * 32767
) random
FROM dual;
Colonnes / sortie
- random — valeur entière comprise entre 0 et 32767, dérivée des décimales du ratio "secondes écoulées depuis minuit / secondes dans une journée".
Limites
Cette astuce a une entropie très faible : la valeur ne change qu'une fois par seconde (elle est identique pour tout appel dans la même seconde) et redevient prévisible connaissant l'heure d'exécution. Elle convient tout au plus pour des besoins ponctuels (génération d'un identifiant de test, données de démonstration) mais ne doit jamais être utilisée pour un besoin nécessitant une réelle imprévisibilité (jetons, mots de passe temporaires, tirage à des fins de sécurité).
Pour un besoin de génération aléatoire sérieux, la fonction native DBMS_RANDOM.VALUE (et la famille de fonctions du package DBMS_RANDOM) est la solution recommandée côté base — bien plus adaptée qu'une astuce arithmétique sur SYSDATE.