I'estou procurando uma boa maneira de executar inserções de várias linhas em uma base de dados Oracle 9. O seguinte funciona no MySQL mas não't parece ser suportado no 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');
Isto funciona no 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
A coisa a lembrar aqui é usar a declaração "a partir do dual".
(fonte)
Use o SQL*Loader. É preciso um pouco de configuração, mas se este é't um desligado, vale a pena.
**Criar tabela***
SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>
**Criar CSV***
oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2%
**Criar arquivo de controle de carregamento***
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%
Executar comando 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
**Confirma inserir***
SQL> select * from ldr_test;
ID DESCRIPTION
---------- --------------------
1 Apple
2 Orange
3 Pear
SQL>
SQL*Loader tem muitas opções, e pode tomar praticamente qualquer arquivo de texto como sua entrada. Você pode até mesmo inlinear os dados no seu arquivo de controle, se quiser.
Aqui está uma página com mais alguns detalhes -> SQL*Loader
Se você já tiver os valores que deseja inserir em outra tabela, poderá inserir a partir de uma expressão selecionada.
INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;
Caso contrário, você pode listar um monte de instruções de inserção de uma única linha e enviar várias consultas em massa para poupar tempo para algo que funciona tanto no Oracle como no MySQL.
@Espo's também é uma boa solução que irá funcionar tanto na Oracle como no MySQL se os seus dados estiverem't já numa tabela.