Categorias:

Funções de tabela

GENERATOR

Cria linhas de dados com base em um número especificado de linhas, um período de geração especificado (em segundos) ou ambos. Esta função de tabela definida pelo sistema permite a geração de linhas sintéticas.

Note que é possível gerar tabelas virtuais com 0 colunas mas possivelmente com muitas linhas. Tais tabelas virtuais são úteis para consultas cuja cláusula SELECT consiste inteiramente em funções geradoras de dados.

Sintaxe

GENERATOR( ROWCOUNT => <count> [ , TIMELIMIT => <sec> ] )

GENERATOR( [ TIMELIMIT => <sec> ] )
Copy

Notas de uso

  • count e sec devem ser constantes inteiras não negativas.

  • Se apenas o argumento ROWCOUNT for especificado, a tabela resultante conterá count linhas.

  • Se apenas o argumento TIMELIMIT for especificado, a consulta é executada por sec segundos, gerando o maior número possível de linhas dentro do período. A contagem exata das linhas depende da velocidade do sistema e não é inteiramente determinista.

  • Se ambos os argumentos ROWCOUNT e TIMELIMIT forem especificados, então:

    • Se ROWCOUNT for alcançado antes de TIMELIMIT, a tabela resultante conterá count linhas.

    • Se TIMELIMIT for alcançado antes do ROWCOUNT, a tabela conterá o número de linhas geradas dentro do período. A contagem exata das linhas depende da velocidade do sistema e não é inteiramente determinista.

  • Se ROWCOUNT ou TIMELIMIT for nulo, ele será ignorado. Então generator(ROWCOUNT => null) gera 0 linhas.

  • Se ambos os parâmetros (ROWCOUNT e TIMELIMIT) forem omitidos, a função GENERATOR retorna 0 linhas.

  • O conteúdo das linhas é determinado pelas funções da cláusula de projeção, não pela própria função GENERATOR. Para obter mais detalhes, consulte a seção Exemplos abaixo. Consulte também a(s) descrição(ões) das funções específicas (por exemplo SEQ()), que você planeja usar na cláusula de projeção; nem todas as funções válidas produzem sequências sem lacunas.

Exemplos

Nota

Estes exemplos geram sequências que podem ter lacunas. Para exemplos que geram sequências sem lacunas, consulte SEQ1 / SEQ2 / SEQ4 / SEQ8 e ROW_NUMBER.

Este exemplo utiliza a função GENERATOR para gerar 10 linhas. O conteúdo das linhas é determinado pelas funções na cláusula de projeção:

  • A coluna SEQ4() gera uma sequência de números inteiros de 4 bytes, começando com 0.

  • A coluna UNIFORM(…) gera valores na faixa entre o primeiro parâmetro (1) e o segundo parâmetro (10), com base em uma função ou em uma constante passada como terceiro parâmetro.

Este exemplo inclui uma “semente” opcional para a função RANDOM() para que a saída seja consistente:

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

Este exemplo é semelhante ao exemplo anterior, exceto que ele passa uma constante e não uma função como terceiro parâmetro para a função UNIFORM. O resultado é que a saída para a coluna UNIFORM é a mesma para cada linha.

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

Se você omitir os parâmetros ROWCOUNT e TIMELIMIT, a saída será de 0 linhas:

SELECT seq4(), uniform(1, 10, RANDOM(12)) 
  FROM TABLE(GENERATOR()) v 
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
+--------+----------------------------+
Copy

O exemplo seguinte utiliza o parâmetro TIMELIMIT sem o parâmetro ROWCOUNT.

SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;

+---------------+
| COUNT(SEQ4()) |
|---------------|
|    3615440896 |
+---------------+
Copy