2009-08-23 7 views
0

Je me demandais s'il existait un moyen d'affecter de nouvelles données dans une table à une clé étrangère existante. Par exemple, si j'utilise la boucle suivante pour assigner des nombres générés aléatoirement aux colonnes de la table client, comment pourrais-je lier cust_id, que j'ai affecté comme clé étrangère dans la table Ventes, avec de nouvelles données créées chaque fois nouvelle vente est faite?Affectation de données dans une nouvelle table à une clé étrangère existante dans une boucle for

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

Essayez de formater votre code. Je soupçonne que vous n'obtiendrez pas beaucoup de réponses quand votre code est un désordre jeté ensemble comme ceci. –

+0

J'étais la personne qui a posté la question ci-dessus. Je vais également utiliser le générateur aléatoire pour affecter des valeurs à la table des ventes. Mais ce que je me demandais, c'est comment assigner un cust_id aux données nouvellement générées dans la table des ventes. Aussi, qu'est-ce que la ligne: où mod (cust_id, 13) = 0; signifier? Merci. – taksIV

+0

où mod (cust_id, 13) = 0 utilise le module pour générer un enregistrement de vente aléatoire pour chaque treizième enregistrement client. – APC

Répondre

2

Vous générez des données de test pour effectuer un test de performance?

Générons d'abord 2000 clients.

(non testé)

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; 

Maintenant, vous pouvez genereate les données de ventes en sélectionnant la table des clients:

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; 

Je suppose qu'il ya une séquence pour créer un identifiant de vente.

amélioration de edit1:

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;