Je suis à la recherche d'un bon moyen d'effectuer des insertions de plusieurs lignes dans une base de données Oracle 9. La méthode suivante fonctionne avec MySQL mais ne semble pas être prise en charge par Oracle.
INSERT INTO TMP_DIM_EXCH_RT
(EXCH_WH_KEY,
EXCH_NAT_KEY,
EXCH_DATE, EXCH_RATE,
FROM_CURCY_CD,
TO_CURCY_CD,
EXCH_EFF_DATE,
EXCH_EFF_END_DATE,
EXCH_LAST_UPDATED_DATE)
VALUES
(1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
Cela fonctionne dans Oracle :
insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual
La chose à retenir ici est d'utiliser l'instruction from dual
.
([source][1])
[1] : http://forums.devshed.com/oracle-development-96/how-can-i-do-multirow-insert-in-oracle-406709.html
Utilisez SQL*Loader. Cela demande un peu de configuration, mais si ce n’est pas un cas isolé, cela en vaut la peine.
Créer une table
SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>
Créer un CSV
oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2%
Créer le fichier de contrôle du chargeur
oracle-2% cat ldr_test.ctl
load data
infile 'ldr_test.csv'
into table ldr_test
fields terminated by "," optionally enclosed by '"'
( id, description )
oracle-2%
*Exécuter la commande SQLLoader**.
oracle-2% sqlldr <username> control=ldr_test.ctl
Password:
SQL*Loader: Release 9.2.0.5.0 - Production on Wed Sep 3 12:26:46 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Commit point reached - logical record count 3
Confirmer l'insertion
SQL> select * from ldr_test;
ID DESCRIPTION
---------- --------------------
1 Apple
2 Orange
3 Pear
SQL>
SQL*Loader a beaucoup d'options, et peut prendre à peu près n'importe quel fichier texte comme entrée. Vous pouvez même intégrer les données dans votre fichier de contrôle si vous le souhaitez.
Voici une page avec plus de détails -> [SQL*Loader][1]
Si vous avez déjà les valeurs que vous voulez insérer dans une autre table, vous pouvez insérer à partir d'une instruction de sélection.
INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;
Sinon, vous pouvez lister un ensemble d'instructions d'insertion à une seule ligne et soumettre plusieurs requêtes en vrac pour gagner du temps et obtenir quelque chose qui fonctionne à la fois dans Oracle et MySQL.
La solution de @Espo'est également une bonne solution qui fonctionnera à la fois dans Oracle et MySQL si vos données ne sont pas déjà dans une table.