Beste manier om multi-row insert te doen in Oracle?

Ik'ben op zoek naar een goede manier om multi-rij inserts uit te voeren in een Oracle 9 database. Het volgende werkt in MySQL maar lijkt niet te worden ondersteund in 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');
Oplossing

Dit werkt in 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

Wat je hier moet onthouden is dat je het from dual statement moet gebruiken.

(bron)

Commentaren (7)

Gebruik SQL*Loader. Het vergt wat instellingen, maar als dit niet eenmalig is, is het de moeite waard.

Create Table

SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>

Create CSV

oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2% 

Create Loader Control File

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% 

*Uitvoeren SQLLoader commando**

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

Bevestig invoegen

SQL> select * from ldr_test;

        ID DESCRIPTION
---------- --------------------
         1 Apple
         2 Orange
         3 Pear

SQL>

SQL*Loader heeft veel opties, en kan vrijwel elk tekstbestand als invoer gebruiken. Je kunt zelfs de data inline in je control file zetten als je dat wilt.

Hier is een pagina met wat meer details -> SQL*Loader

Commentaren (4)

Als u de waarden die u wilt invoegen al in een andere tabel hebt, dan kunt u invoegen vanuit een select statement.

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

Anders kun je een heleboel single row insert statements opnoemen en verschillende queries in bulk indienen om tijd te besparen voor iets dat zowel in Oracle als in MySQL werkt.

@Espo's oplossing is ook een goede die zowel in Oracle als in MySQL zal werken als je gegevens niet al in een tabel staan.

Commentaren (0)