- Kategorien:
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¶
count
undsec
müssen nicht negative Ganzzahlkonstanten sein.Wenn nur das Argument
ROWCOUNT
angegeben ist, enthält die resultierende Tabellecount
Zeilen.Wenn nur das Argument
TIMELIMIT
angegeben ist, wird die Abfrage fürsec
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 beide Argumente
ROWCOUNT
undTIMELIMIT
angegeben sind, gilt Folgendes:Wenn
ROWCOUNT
vorTIMELIMIT
erreicht wird, enthält die resultierende Tabellecount
Zeilen.Wenn
TIMELIMIT
vorROWCOUNT
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
oderTIMELIMIT
null ist, werden sie ignoriert.generator(ROWCOUNT => null)
generiert also 0 Zeilen.Wenn beide Parameter (
ROWCOUNT
undTIMELIMIT
) 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¶
Bemerkung
Diese Beispiele generieren Sequenzen, die Lücken haben können. Beispiele für Sequenzen ohne Lücken finden Sie unter SEQ1 / SEQ2 / SEQ4 / SEQ8 und ROW_NUMBER.
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 |
+---------------+