Kategorien:

Tabellenfunktionen

GENERATOR

Erstellt Datenzeilen, die entweder auf einer bestimmten Anzahl von Zeilen, einem bestimmten Generierungszeitraum (in Sekunden) oder beidem basieren. Diese systemdefinierte Tabellenfunktion ermöglicht die Generierung synthetischer Zeilen.

Beachten Sie, dass es möglich ist, virtuelle Tabellen mit 0 Spalten, aber ggf. vielen Zeilen zu generieren. Solche virtuellen Tabellen sind nützlich für Abfragen, deren SELECT-Klausel ausschließlich aus datengenerierenden Funktionen besteht.

Syntax

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

GENERATOR( [ TIMELIMIT => <sec> ] )

Nutzungshinweise

  • Anzahl und Sek müssen nicht negative Ganzzahlkonstanten sein.

  • Wenn nur das Argument ROWCOUNT angegeben ist, enthält die resultierende Tabelle Anzahl Zeilen.

  • Wenn nur das Argument TIMELIMIT angegeben ist, wird die Abfrage für Sek Sekunden ausgeführt. In dieser Zeit werden so viele Zeilen wie möglich generiert. Die genaue Anzahl der Zeilen hängt von der Systemgeschwindigkeit ab und ist nicht vollständig deterministisch.

  • Wenn sowohl die Argumente ROWCOUNT als auch TIMELIMIT angegeben sind, gilt Folgendes:

    • Wenn ROWCOUNT vor TIMELIMIT erreicht wird, enthält die resultierende Tabelle Anzahl Zeilen.

    • Wenn TIMELIMIT vor ROWCOUNT erreicht ist, enthält die Tabelle die Anzahl der Zeilen, die innerhalb des Zeitrahmens generiert wurden. Die genaue Anzahl der Zeilen hängt von der Systemgeschwindigkeit ab und ist nicht vollständig deterministisch.

  • Wenn ROWCOUNT oder TIMELIMIT null ist, werden sie ignoriert. generator(ROWCOUNT => null) generiert also 0 Zeilen.

  • Wenn beide Parameter (ROWCOUNT und TIMELIMIT) nicht angegeben werden, gibt die Funktion GENERATOR 0 Zeilen zurück.

  • Der Inhalt der Zeilen wird von den Funktionen in der Projektionsklausel bestimmt, nicht von der Funktion GENERATOR selbst. Weitere Details dazu finden Sie im Abschnitt „Beispiele“ unten. Siehe auch die Beschreibung der spezifischen Funktionen, z. B. SEQ(), die Sie in der Projektionsklausel verwenden möchten. Nicht alle gültigen Funktionen erzeugen lückenlose Sequenzen.

Beispiele

In diesem Beispiel wird die Funktion GENERATOR verwendet, um 10 Zeilen zu generieren. Der Inhalt der Zeilen wird durch die Funktionen in der Projektionsklausel bestimmt:

  • Die Spalte SEQ4() generiert eine Folge von 4-Byte-Ganzzahlen, beginnend mit 0.

  • Die Spalte UNIFORM(…) generiert Werte im Bereich zwischen dem ersten Parameter (1) und dem zweiten Parameter (10), die entweder auf einer Funktion oder einer Konstante basieren, die als dritter Parameter übergeben wird.

Dieses Beispiel enthält einen optionalen Startwert für die Funktion RANDOM(), damit die Ausgabe konsistent ist:

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

Dieses Beispiel ähnelt dem vorherigen Beispiel, außer dass es als dritter Parameter eine Konstante anstelle einer Funktion an die Funktion UNIFORM übergibt. Das Ergebnis ist, dass die Ausgabe für die Spalte UNIFORM für jede Zeile gleich ist.

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

Wenn Sie die Parameter ROWCOUNT und TIMELIMIT nicht angeben, werden 0 Zeilen ausgegeben:

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

Im folgenden Beispiel wird der Parameter TIMELIMIT ohne den Parameter ROWCOUNT verwendet.

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

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