2010-09-06 6 views
5

Ich muss eine Oracle-Tabellen mit zufälliger Anzahl von Spalten für den Belastungstest erstellen. Ich möchte nur die Anzahl der Spalten mit dem Typ NUMBER angeben, die Anzahl der Spalten mit dem Typ VARCHAR2 usw. und die Felder sollten automatisch generiert werden. Außerdem werde ich die Tabellen mit zufälligen Daten füllen, für die ich dbms_random verwenden werde.Wie erstellt man eine Tabelle mit einer zufälligen Anzahl von Feldern in Oracle mit PL/SQL?

Wie kann ich das erreichen?

Antwort

9

„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.

+0

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

1

Sie können diese Tabelle selbst erzeugen.

Tabelle erstellen mit den erforderlichen Datentypen:

Create Table RandomTable 
    AS 
    Select dbms_random.string('A', 1) CharField, 
     dbms_random.string('a', 20) VarCharField, 
     TRUNC(dbms_random.value(0, 35000)) IntField, 
     dbms_random.value(0, 35000) NumberField, 
     Level SequenceField, 
     sysdate + dbms_random.value(-3500, 3500) DateField 
    from dual connect by level < 1000 

(Sie können 1000 bis erforderlichen Zeilen Zahlen ändern, und die erforderlichen Datentypen hinzufügen)

Danach können Sie erstellen oder füllen Tabellen mit Zufallsdaten von Random

Create Table TestTable1 
    AS 
    SELECT CharField as a, NumberField as b 
    from RandomTable 

    INSERT INTO TestTable2(DateFrom, Quantity) 
    SELECT DateField, IntField 
    from RandomTable 
    Where SequenceField <= 500 
2

Zwei Ansätze

1) Schreiben Sie Code, um Textdateien zu generieren, die die CREATE TABLE-Befehle enthalten, die Sie ausführen und Ihre Tabellen füllen müssen, und führen Sie dann diese mit SQL * Plus aus.

2) Verwenden Sie dynamische SQL innerhalb PL/SQL Embedded -

PROCEDURE create_random_table 
     (pTableName IN VARCHAR2, 
     pNumberOfColumns IN INTEGER) 
IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
    lCommand VARCHAR2(32000); 
BEGIN 
    lCommand := 
    'CREATE TABLE '||pTableName||'('; 
    FOR i IN 1..pNumberOfColumns LOOP 
     append your column definition here 
    END LOOP; 
    lCommand := lCommand||';'; 
    -- 
    EXECUTE IMMEDIATE lCommand; 
END; 

Sie könnten auch 'TABLE AS SELECT CREATE' Tisch zur gleichen Zeit zu füllen (siehe andere Antwort).

Dies sollte Ihnen einen guten Ausgangspunkt geben - es gibt nichts im System, das tun wird, was Sie wollen, ohne Code zu schreiben.

Verwandte Themen