- Categorias:
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> ] )
Notas de uso¶
count
esec
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 porsec
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
eTIMELIMIT
forem especificados, então:Se
ROWCOUNT
for alcançado antes deTIMELIMIT
, a tabela resultante conterácount
linhas.Se
TIMELIMIT
for alcançado antes doROWCOUNT
, 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
ouTIMELIMIT
for nulo, ele será ignorado. Entãogenerator(ROWCOUNT => null)
gera 0 linhas.Se ambos os parâmetros (
ROWCOUNT
eTIMELIMIT
) 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 | +--------+----------------------------+
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 | +--------+--------------------+
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)) | |--------+----------------------------| +--------+----------------------------+
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 |
+---------------+