Générer x lignes à partir de dual facilement

Une astuce sympa pour générer plein de lignes à partir sans avoir besoin de table derrière …

Pour générer des lignes on utilise souvent la table DUAL, par exemple pour simuler une table de dimension contenant un nombre limité de valeurs :

select 'a' code_famille, 'audio' libelle_famille from dual UNION ALL
select 'v' , 'video'  from dual UNION ALL
select 'm' , 'multimedia' from dual

On peut aussi utiliser cette méthode pour générer des séquences de chiffres, mais il faut dans ce cas écrire autant de lignes qu’on veut de valeurs :

-- 10000 lignes :
select 1 x from dual UNION ALL
select 2 from dual UNION ALL
select 3 from dual UNION ALL
select 4 from dual UNION ALL
select 5 from dual UNION ALL
...........................
select 10000 from dual

Dans ce cas il vaut mieux passer par une boucle en PL/SQL, mais ça devient compliqué …
On peut simplifier en une seule ligne en détournant les requêtes hiérarchiques, et le code précédent se résume alors à :

SELECT level FROM dual connect BY level <= 10000

Les utilisations sont diverses et variées, on peut par exemple :

- générer des données de test pour des tests de perf :

SELECT 1 FROM dual connect BY level <= 1000000

ou aléatoires pour des tests :

select dbms_random.random() from dual connect BY level <= 1000

- incrémenter une séquence de manière élégante :-o

select sequence.nextval FROM dual connect BY level <= 1000

– simuler une dimension temps sans avoir de table calendrier sous la main :

-- les 100 derniers jours :
select trunc(sysdate)-level  FROM dual connect BY level <= 100

Simple non ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

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>