Meilleur moyen d'insérer plusieurs rangs dans Oracle ?

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');
Solution

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

Commentaires (7)

Utilisez SQL*Loader. Cela demande un peu de configuration, mais si ce n&#8217est 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  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]

[1] : http://www.orafaq.com/wiki/SQL%2ALoader_FAQ

Commentaires (4)

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.

Commentaires (0)