Question

Je recherche un bon moyen d'effectuer des insertions multi-lignes dans une base de données Oracle 9.Ce qui suit fonctionne dans MySQL mais ne semble pas être pris en charge dans 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');
Était-ce utile?

La 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 le from dual déclaration.

(source)

Autres conseils

Dans Oracle, pour insérer plusieurs lignes dans le tableau t avec les colonnes col1, col2 et col3, vous pouvez utiliser la syntaxe suivante :

INSERT ALL
   INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;

Utilisez SQL*Loader.Cela demande un peu de mise en place, mais si ce n'est pas ponctuel, cela en vaut la peine.

Créer un tableau

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 un 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 SQL*Loader

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 de nombreuses options et peut prendre à peu près n'importe quel fichier texte en 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*Chargeur

Chaque fois que j'ai besoin de le faire, je construis un simple bloc PL/SQL avec une procédure locale comme celle-ci :

declare
   procedure ins
   is
      (p_exch_wh_key INTEGER, 
       p_exch_nat_key INTEGER, 
       p_exch_date DATE, exch_rate NUMBER, 
       p_from_curcy_cd VARCHAR2, 
       p_to_curcy_cd VARCHAR2, 
       p_exch_eff_date DATE, 
       p_exch_eff_end_date DATE, 
       p_exch_last_updated_date DATE);
   begin
      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
      (p_exch_wh_key, 
       p_exch_nat_key, 
       p_exch_date, exch_rate, 
       p_from_curcy_cd, 
       p_to_curcy_cd, 
       p_exch_eff_date, 
       p_exch_eff_end_date, 
       p_exch_last_updated_date);
   end;
begin
   ins (1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
end;
/

Si vous disposez déjà des valeurs que vous souhaitez insérer dans une autre table, vous pouvez les insérer à partir d’une instruction select.

INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;

Sinon, vous pouvez lister un tas d'instructions d'insertion sur une seule ligne et soumettre plusieurs requêtes en masse pour gagner du temps sur quelque chose qui fonctionne à la fois dans Oracle et MySQL.

@EspoLa solution de 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.

Des curseurs peuvent également être utilisés, bien que cela soit inefficace.L'article suivant sur stackoverflow traite de l'utilisation des curseurs :

INSÉRER et METTRE À JOUR un enregistrement à l'aide de curseurs dans Oracle

vous pouvez insérer en utilisant une boucle si vous souhaitez insérer des valeurs aléatoires.

BEGIN 
    FOR x IN 1 .. 1000 LOOP
         INSERT INTO MULTI_INSERT_DEMO (ID, NAME)
         SELECT x, 'anyName' FROM dual;
    END LOOP;
END;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top