„Ich will nur Anzahl von Spalten mit Typnummer, Anzahl der Spalten mit Typ VARCHAR2 etc und die Felder angeben sollte automatisch generiert werden.“
Das folgende Verfahren macht genau das. Beachten Sie, dass es eher einfach ist; Sie möchten es anspruchsvoller machen, beispielsweise durch die Länge der varchar2 Spalten variiert:
SQL> create or replace procedure bld_table
2 (p_tab_name in varchar2
3 , no_of_num_cols in pls_integer
4 , no_of_var_cols in pls_integer
5 , no_of_date_cols in pls_integer
6 )
7 as
8 begin
9 execute immediate 'create table '||p_tab_name||' ('
10 ||' pk_col number not null'
11 ||', constraint '||p_tab_name||'_pk primary key (pk_col) using index)';
12 <<numcols>>
13 for i in 1..no_of_num_cols loop
14 execute immediate 'alter table '||p_tab_name||' add '
15 ||' col_n'||trim(to_char(i))||' number';
16 end loop numcols;
17 <<varcols>>
18 for i in 1..no_of_var_cols loop
19 execute immediate 'alter table '||p_tab_name||' add '
20 ||' col_v'||trim(to_char(i))||' varchar2(30)';
21 end loop varcols;
22 <<datcols>>
23 for i in 1..no_of_date_cols loop
24 execute immediate 'alter table '||p_tab_name||' add '
25 ||' col_d'||trim(to_char(i))||' date';
26 end loop datcols;
27 end bld_table;
28/
Procedure created.
SQL>
Hier in Aktion:
SQL> exec bld_table ('T23', 2, 3, 0)
PL/SQL procedure successfully completed.
SQL> desc t23
Name Null? Type
----------------------------------------- -------- ----------------------------
PK_COL NOT NULL NUMBER
COL_N1 NUMBER
COL_N2 NUMBER
COL_V1 VARCHAR2(30 CHAR)
COL_V2 VARCHAR2(30 CHAR)
COL_V3 VARCHAR2(30 CHAR)
SQL>
Wir auch dynamische SQL zum Auffüllen der Tabelle verwenden können mit Zeilen von Zufallsdaten.
Beachten Sie, dass der Primärschlüssel mit dem ROWNUM gefüllt ist, so dass es höchstwahrscheinlich fehlschlägt, wenn die Tabelle bereits Zeilen enthält.
SQL> exec pop_table('T23', 4)
PL/SQL procedure successfully completed.
SQL> select * from t23
2/
PK_COL COL_N1 COL_N2 COL_V1 COL_V2 COL_V3
---------- ---------- ---------- ------------------------------ ----------------------------- ------------------------------
1 913.797432 934.265814 NUtxjLoRQMCTLNMPKVGbTZwJeYaqnXTkCcWu WFRSHjXdLfpgVYOjzrGrtUoX jIBSoYOhSdhRFeEeFlpAxoanPabvwK
2 346.879815 104.800387 NTkvIlKeJWybCTNEdvsqJOKyidNkjgngwRNN PPIOInbzInrsVTmFYcDvwygr RyKFoMoSiWTmjTqRBCqDxApIIrctPu
3 93.1220275 649.335267 NTUxzPRrKKfFncWaeuzuyWzapmzEGtAwpnjj jHILMWJlcMjnlboOQEIDFTBG JRozyOpWkfmrQJfbiiNaOnSXxIzuHk
4 806.709357 857.489387 ZwLLkyINrVeCkUpznVdTHTdHZnuFzfPJbxCB HnoaErdzIHXlddOPETzzkFQk dXWTTgDsIeasNHSPbAsDRIUEyPILDT
4 rows selected.
SQL>
Auch hier gibt es viele Möglichkeiten, die Raffinesse der Daten zu verbessern.
Nebenbei ist die Verwendung dieser Art von Datenpools für Lasttests nicht immer eine gute Idee.Leistungsprobleme werden oft durch Verzerrungen in der Verteilung von Datenwerten verursacht, die Sie mit DBMS_RANDOM nicht bekommen werden. Dies gilt insbesondere für einige Datumsspalten, z. START_DATE - die im wirklichen Leben tendenziell zusammen gruppiert sind, aber das obige Verfahren wird dieses Muster nicht erzeugen. In ähnlicher Weise führt das Ausfüllen der varchar2-Spalten zu Tabellen, die mehr Speicher belegen, als sie in der Praxis benötigen.
Kurz gesagt, sind zufällig generierte Daten besser als nichts, aber wir müssen ihre Schwächen verstehen.
Genau das, was ich brauchte! Danke für die ausführliche Antwort. Ich stimme zu, dass Einschränkungen mit zufällig generierten Daten sind. Ich werde den Umfang der Randomisierung für Daten begrenzen, von denen ich weiß, dass sie ähnlich sind. Dies sollte für Zahlen und Strings möglich sein. Ich bin mir nicht sicher über Termine – Chandam