2009-08-23 8 views
0

Ich fragte mich, ob es eine Möglichkeit gab, neue Daten in einer Tabelle einem vorhandenen Fremdschlüssel zuzuweisen. Zum Beispiel, wenn ich die folgende Schleife verwenden würde, um zufällig generierte Zahlen zu Spalten in der Kundentabelle zuzuweisen, wie wäre ich in der Lage, cust_id, die ich als Fremdschlüssel in der Tabelle Sales zugewiesen haben, mit neuen Daten jedes Mal erstellt werden a neuer Verkauf ist gemacht?Zuweisen von Daten in einer neuen Tabelle zu einem vorhandenen Fremdschlüssel in einer For-Schleife

CUSTOMER: 
DECLARE 
     v_cust_id   NUMBER(4) NOT NULL := 0000; 
     v_cust_name  VARCHAR2(30); 
     v_cust_add   VARCHAR2(30); 
     v_phone   VARCHAR2(10); 
BEGIN 
     FOR v IN 1 .. 2000 --Loop 2000 times to create data for the 2000 customers in the database. 
     LOOP 
       v_cust_id := v_cust_id + 1; 
       v_cust_name := dbms_random.string('U',5); 
       v_cust_add := dbms_random.string('A',15); 
       v_phone := dbms_random.value(1000000,9999999); 
         INSERT INTO customer (cust_id, cust_name, cust_add, phone) 
           VALUES (v_cust_id, v_cust_name, v_cust_add, v_phone); 
     END LOOP; 
END; 
/

SALES: 
DECLARE 
     v_sale_id     NUMBER(4) NOT NULL := ; 
     v_sale_price    NUMBER(8,2); 
     v_sale_date    DATE; 
     v_no_of_prods    NUMBER(4); 
     v_prod_id     NUMBER(4); 
     v_desp_id     NUMBER(4); 
     v_cust_id     NUMBER(4); 
BEGIN 
     FOR v IN 1 .. 10 
     LOOP 
       v_sale_id := 
       v_sale_price 
       v_sale_date := 
       v_no_of_products := 
       v_prod_id := 
       v_desp_id := 
       v_cust_id := 
         INSERT INTO sales (sale_id, sale_price, sale_date, no_of_prods, prod_id, desp_id, cust_id) 
           VALUES (v_sale_id, v_sale_price, v_sale_date, v_no_of_prods, v_prod_id, v_desp_id, v_cust_id); 
     END LOOP; 
END; 
\ 
+0

Versuchen Sie Ihr Code-Formatierung. Ich vermute, dass du nicht viele Antworten bekommst, wenn dein Code ein solches Chaos ist. –

+0

Ich war die Person, die die Frage oben gepostet hat. Ich werde den Zufallsgenerator verwenden, um Werte auch der Verkaufstabelle zuzuordnen. Aber ich frage mich, wie Sie neu generierten Daten eine cust_id in die Verkaufstabelle zuweisen würden. Auch, was bedeutet die Zeile: wo mod (cust_id, 13) = 0; bedeuten? Danke. – taksIV

+0

Dabei verwendet mod (cust_id, 13) = 0 den Modulus, um einen zufälligen Verkaufsdatensatz für jeden dreizehnten Kundeneintrag zu generieren. – APC

Antwort

2

Sie generieren Testdaten für eine Art Leistungstest?

Lassen Sie uns zunächst 2000 Kunden generieren.

(ungetestet)

insert into customer 
(cust_id, cust_name, cust_add, phone) 
select 
level l, 
dbms_random.string('U',5), 
dbms_random.string('A',15), 
dbms_random.value(1000000,9999999) 
from dual 
connect by level <= 2000; 

Jetzt können Sie Verkaufsdaten genereate durch vom Kunden Tabelle auswählen:

insert into sales 
(sale_id, sale_price, sale_date, no_of_prods, prod_id, desp_id, cust_id) 
select sale_id_sequence.nextval , dbms_random. ...., cust_id 
from customer; 

insert into sales 
(sale_id, sale_price, sale_date, no_of_prods, prod_id, desp_id, cust_id) 
select sale_id_sequence.nextval , dbms_random. ...., cust_id 
from customer 
where mod(cust_id,2) =0; 

insert into sales 
(sale_id, sale_price, sale_date, no_of_prods, prod_id, desp_id, cust_id) 
select sale_id_sequence.nextval , dbms_radom. ...., cust_id 
from customer 
where mod(cust_id,7) =0; 

insert into sales 
(sale_id, sale_price, sale_date, no_of_prods, prod_id, desp_id, cust_id) 
select sale_id_sequence.nextval , dbms_random. ...., cust_id 
from customer 
where mod(cust_id,13) =0; 

commit; 

Ich nehme an, es ist eine Sequenz, die einen Verkauf ID zu erstellen.

edit1 Verbesserung:

create table customer 
(cust_id number(10) 
, cust_name varchar2(50) 
, cust_add varchar2(30) 
, cust_phone varchar2(10) 
); 

create sequence cust_id_seq; 

create table sales 
(sale_id number(10) 
, prod_no number(10) 
, cust_id number(10) 
); 

create sequence sale_id_seq; 

begin 

    insert into customer 
    select cust_id_seq.nextval 
    ,  dbms_random.string('U',5) 
    ,  dbms_random.string('A',15) 
    ,  trunc(dbms_random.value(1000000,9999999)) 
    from dual 
    connect by level < 2000; 

    for i in 1..10 loop 

    insert into sales 
    select sale_id_seq.nextval 
    ,  trunc(dbms_random.value(1,100)) 
    ,  cust_id 
    from customer; 

    insert into sales 
    select sale_id_seq.nextval 
    ,  trunc(dbms_random.value(1,100)) 
    ,  cust_id 
    from customer 
    where mod(cust_id+i,2)=0; 

    insert into sales 
    select sale_id_seq.nextval 
    ,  trunc(dbms_random.value(1,100)) 
    ,  cust_id 
    from customer 
    where mod(cust_id+i,7)=0; 

    end loop; 

end; 
/

commit; 

select count(*) from customer; 

select count(*) from sales;