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 '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 :
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
select sequence.nextval FROM dual connect BY level <= 1000
– simuler une dimension temps sans avoir de table calendrier sous la main :
select trunc(sysdate)-level FROM dual connect BY level <= 100
Simple non ?