2015-03-15 3 views
1

Je souhaite insérer un million d'enregistrements dans une table DB Oracle. J'ai accompli la tâche semblable dans mysql using la jointure croisée comme suit:Comment insérer 1 million d'enregistrements dans la base de données de tables Oracle à l'aide de la jointure croisée

1) insérez 10 dossiers d'abord.

insert into spltest_sampleapl2 values (10001, 'aaaa'); 
insert into spltest_sampleapl2 values (10002, 'bbbbb'); 
insert into spltest_sampleapl2 values (10003, 'ccccc'); 
insert into spltest_sampleapl2 values (10004, 'dddddd'); 
insert into spltest_sampleapl2 values (10005, 'eeeeeeeee'); 
insert into spltest_sampleapl2 values (10006, 'ffffff'); 
insert into spltest_sampleapl2 values (10007, 'gggggggg'); 
insert into spltest_sampleapl2 values (10008, 'hhhhhh'); 
insert into spltest_sampleapl2 values (10009, 'iiiiii'); 
insert into spltest_sampleapl2 values (10010, 'jjjjjj'); 
commit; 

2) à l'aide variable utilisateur

set @num := 10010; 

3) d'insérer des enregistrements avec un seul rejoindre

insert into apl2 (id, data) select (@num := @num + 1) ,s1.data from apl2 s1, apl2 s2, apl2 s3, apl2 s4,apl2 s5, apl2 s6; 
commit; 

Maintenant, je veux faire la même chose sur schéma similaire dans Oracle. Comment faire ?

Répondre

0

premier i inséré enregistrement ayant id de 1000000 à 1000010 (10 dossiers) , alors j'ai utilisé la commande suivante.

insert into apl2(id, data) select rownum ,s1.data from apl2 s1, apl2 s2, apl2 s3, apl2 s4, apl2 s5, apl2 s6 where rownum < 1000001; 
0

Mettre en place une séquence et l'utiliser pour la numérotation automatique:

create sequence seq_apl2; 

insert into apl2(id, data) 
    select seq_apl2.nextval, s1.data 
    from apl2 s1 cross join apl2 s2 cross join 
     apl2 s3 cross join apl2 s4 cross join 
     apl2 s5 cross join apl2 s6; 

EDIT:

Si vous n'avez pas la possibilité d'utiliser des séquences, puis utilisez row_number():

insert into apl2(id, data) 
    select row_number() over (order by NULL), s1.data 
    from apl2 s1 cross join apl2 s2 cross join 
     apl2 s3 cross join apl2 s4 cross join 
     apl2 s5 cross join apl2 s6; 

Vous pouvez ajouter un décalage si vous le souhaitez.

+0

De cette façon, comment puis-je être sûr de la plage de clés primaires? –

+0

@SubhamTripathi. . . Vous pouvez démarrer la séquence à n'importe quelle valeur ou la modifier pour démarrer sur une autre valeur (http://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm#ADMIN11795). –

+0

mon utilisateur n'a pas l'autorisation de créer une séquence, existe-t-il une autre solution. –

2

Créer une table avec 10 dossiers, numérotés de 0 à 10:

INSERT INTO t (n) VALUES (0); 
INSERT INTO t (n) VALUES (1); 
... 
INSERT INTO t (n) VALUES (9); 

Maintenant select une croix jointure, en utilisant autant d'alias que vous voulez 10^compter n:

Pour 100 enregistrements:

INSERT INTO X 
SELECT t2.n*10 + t1.n FROM t t1, t t2 

Pour 1000 records:

INSERT INTO X 
SELECT t3.n*100 + t2.n*10 + t1.n FROM t t1, t t2, t t3 

Pour 1.000.000 records:

INSERT INTO X 
SELECT t6.n*100000 + t5.n * 10000 + t4.n*1000 + t3.n*100 + t2.n*10 + t1.n FROM t t1, t t2, t t3 

Je suis assez sûr que ce soit SQL vanille qui fonctionnerait sur toute plate-forme ...