Catégories :

Fonctions de table

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

  • nombre et sec doivent être des constantes entières non négatives.

  • Si seul l’argument ROWCOUNT est spécifié, la table résultante contiendra nombre lignes.

  • Si seul l’argument TIMELIMIT est spécifié, la requête s’exécute pendant sec 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 et TIMELIMIT sont spécifiés, alors :

    • Si ROWCOUNT est atteint avant TIMELIMIT, la table résultante contiendra nombre de lignes.

    • Si TIMELIMIT est atteint avant ROWCOUNT, 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 ou TIMELIMIT est nul, ils seront ignorés. Ainsi, generator(ROWCOUNT => null) génère 0 ligne.

  • Si les deux paramètres (ROWCOUNT et TIMELIMIT) 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 description 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

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 |
+---------------+