- Catégories :
GENERATOR¶
Crée des lignes de données basées soit sur un nombre spécifié de lignes, soit sur une période de génération spécifiée (en secondes), soit sur les deux. Cette fonction de table définie par le système active la génération de lignes synthétiques.
Notez qu’il est possible de générer des tables virtuelles avec 0 colonne, mais éventuellement plusieurs lignes. De telles tables virtuelles sont utiles pour les requêtes dont la clause SELECT consiste entièrement en des fonctions générant des données.
Syntaxe¶
GENERATOR( ROWCOUNT => <count> [ , TIMELIMIT => <sec> ] )
GENERATOR( [ TIMELIMIT => <sec> ] )
Notes sur l’utilisation¶
count
etsec
doivent être des constantes entières non négatives.Si seul l’argument
ROWCOUNT
est spécifié, la table résultante contiendracount
lignes.Si seul l’argument
TIMELIMIT
est spécifié, la requête s’exécute pendantsec
secondes, générant le plus grand nombre de lignes possible dans le délai imparti. Le nombre exact de lignes dépend de la vitesse du système et n’est pas entièrement déterministe.Si les arguments
ROWCOUNT
etTIMELIMIT
sont spécifiés, alors :Si
ROWCOUNT
est atteint avantTIMELIMIT
, la table résultante contiendracount
lignes.Si
TIMELIMIT
est atteint avantROWCOUNT
, la table contiendra le nombre de lignes générées dans la période. Le nombre exact de lignes dépend de la vitesse du système et n’est pas entièrement déterministe.
Si
ROWCOUNT
ouTIMELIMIT
est nul, ils seront ignorés. Ainsi,generator(ROWCOUNT => null)
génère 0 ligne.Si les deux paramètres (
ROWCOUNT
etTIMELIMIT
) sont omis, la fonction GENERATOR renvoie 0 ligne.Le contenu des lignes est déterminé par les fonctions de la clause de projection et non par la fonction GENERATOR. Pour plus de détails, voir les exemples ci-dessous. Voir également la ou les description(s) des fonctions spécifiques (par exemple, SEQ()), que vous prévoyez d’utiliser dans la clause de projection ; toutes les fonctions valides ne produisent pas des séquences sans écarts.
Exemples¶
Note
Ces exemples génèrent des séquences qui peuvent présenter des écarts. Pour des exemples qui génèrent des séquences sans écarts, reportez-vous à SEQ1 / SEQ2 / SEQ4 / SEQ8 et à ROW_NUMBER.
Cet exemple utilise la fonction GENERATOR pour générer 10 lignes. Le contenu des lignes est déterminé par les fonctions de la clause de projection :
La colonne SEQ4() génère une séquence d’entiers de 4 octets, commençant par 0.
La colonne UNIFORM(…) génère des valeurs comprises entre le premier paramètre (1) et le deuxième paramètre (10), selon une fonction ou une constante transmise en tant que troisième paramètre.
Cet exemple inclut une « graine » facultative pour la fonction RANDOM() afin que la sortie soit cohérente :
SELECT seq4(), uniform(1, 10, RANDOM(12)) FROM TABLE(GENERATOR(ROWCOUNT => 10)) v ORDER BY 1; +--------+----------------------------+ | SEQ4() | UNIFORM(1, 10, RANDOM(12)) | |--------+----------------------------| | 0 | 7 | | 1 | 2 | | 2 | 5 | | 3 | 9 | | 4 | 6 | | 5 | 9 | | 6 | 9 | | 7 | 5 | | 8 | 3 | | 9 | 8 | +--------+----------------------------+
Cet exemple est similaire à l’exemple précédent, à la différence qu’il transmet une constante plutôt qu’une fonction en tant que troisième paramètre à la fonction UNIFORM
. Le résultat est que la sortie de la colonne UNIFORM
est la même pour chaque ligne.
SELECT seq4(), uniform(1, 10, 42) FROM TABLE(GENERATOR(ROWCOUNT => 10)) v ORDER BY 1; +--------+--------------------+ | SEQ4() | UNIFORM(1, 10, 42) | |--------+--------------------| | 0 | 10 | | 1 | 10 | | 2 | 10 | | 3 | 10 | | 4 | 10 | | 5 | 10 | | 6 | 10 | | 7 | 10 | | 8 | 10 | | 9 | 10 | +--------+--------------------+
Si vous omettez les paramètres ROWCOUNT
et TIMELIMIT
, le résultat est de 0 ligne :
SELECT seq4(), uniform(1, 10, RANDOM(12)) FROM TABLE(GENERATOR()) v ORDER BY 1; +--------+----------------------------+ | SEQ4() | UNIFORM(1, 10, RANDOM(12)) | |--------+----------------------------| +--------+----------------------------+
L’exemple suivant utilise le paramètre TIMELIMIT
sans le paramètre ROWCOUNT
.
SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;
+---------------+
| COUNT(SEQ4()) |
|---------------|
| 3615440896 |
+---------------+