A melhor maneira de fazer inserções multi-linha no Oracle?

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');
Solução

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)

Comentários (7)

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  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

Comentários (4)

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.

Comentários (0)