Testdatengenerierung – Zeilen Generator – ROW Generator – in Oracle
Mit der Pseudotabelle DUAL und dem CONNECT BY LEVEL Klausel kann ab Oracle 10g ein einfacher Zeilengenerator – ROW Generator – mittels SQL entwickelt werden. Ich nutze diese Variante für die Testdatenerstellung meistens in Kombination mit dbms_random.
In diesem Artikel werde ich ein paar Anwendungsbeispiele aufzeigen, welche nach belieben erweitert oder angepasst werden können. Schnell können so Massentestdaten mit wenigen Zeilen Code generiert werden.
Das Basiskonstrukt mit DUAL – CONNECT BY LEVEL
Mit diesem SQL-Statement können künstliche Zeilen – rows – erzeugt werden.
1 2 3 |
SELECT LEVEL COL_01 FROM dual CONNECT BY LEVEL <= :Anzahl_Datenaetze; |
Testdatenerstellung – dbms_random
Das folgende SQL-Statement liefert typische Daten einer Mitarbeitertabelle zurück. Hier sind m.E. die 3 wichtigsten Datentypen enthalten – VARCHAR2, DATE, NUMBER. Es gibt natürlich unzählige Kombinationsmöglichkeiten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT -- Primary Key - hier koennte auch eine Sequence verwendet werden LEVEL ID -- Ein String zwischen 3 und 12 Zeichen. -- Das erste Zeichen ist groß geschrieben, alle anderen klein. , initcap(dbms_random.string('U', dbms_random.VALUE(3,12))) NAME -- Ein String zwischen 5 und 20 Zeichen. -- Das erste Zeichen ist groß geschrieben, alle anderen klein. , initcap(dbms_random.string('U', dbms_random.VALUE(5,20))) VORNAME -- Eine Zahl mit 2 Dezimalstellen zwischen 1000 und 5000 , trunc(dbms_random.VALUE(1000,5000),2) GEHALT -- Ein Datum, welches zwischen 0 und 5000 Tage in der Vergangenheit liegt , TRUNC(SYSDATE - DBMS_RANDOM.value(0,5000)) AS ANGESTELLT_SEIT FROM dual -- Anzahl Datensaetze = 100.000 CONNECT BY LEVEL <= 100000; |
Wenn eine neue Tabelle entsteht, kann mittels CREATE TABLE AS SELECT gearbeitet werden.
1 2 |
CREATE TABLE MITARBEITER AS ... (hier das SQL-Statement von oben einsetzen) |
Wenn eine bestehende Tabelle mit Testdaten aufgefüllt werden soll, kann das Konstrukt INSERT AS SELECT verwendet werden. Hier sollte dann nicht LEVEL als ID, sondern die entsprechende SEQUENCE der Tabelle verwendet werden.
1 2 |
INSERT INTO MITARBEITER (ID,NAME,VORNAME,GEHALT,ANGESTELLT_SEIT) ... (hier das SQL-Statement von oben einsetzen); |
1 KOMMENTAR
