Il modo migliore per fare l'inserimento di più righe in Oracle?

Sto cercando un buon modo per eseguire inserimenti di più righe in un database Oracle 9. Il seguente funziona in MySQL ma non sembra essere supportato 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');
Soluzione

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

La cosa da ricordare qui è di usare l'istruzione from dual.

(fonte)

Commentari (7)

Usate SQL*Loader. Ci vuole un po' di impostazione, ma se questo non è un caso isolato, ne vale la pena.

Creare una tabella

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

Crea CSV

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

Creare il file di controllo del caricatore

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% 

*Esegui il 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

Conferma l'inserimento

SQL> select * from ldr_test;

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

SQL>

SQL*Loader ha molte opzioni e può prendere praticamente qualsiasi file di testo come input. Puoi anche inlineare i dati nel tuo file di controllo, se vuoi.

Ecco una pagina con qualche dettaglio in più -> SQL*Loader

Commentari (4)

Se avete già i valori che volete inserire in un'altra tabella, allora potete inserire da una dichiarazione di selezione.

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

Altrimenti, puoi elencare un mucchio di istruzioni di inserimento a riga singola e inviare diverse query in blocco per risparmiare il tempo per qualcosa che funziona sia in Oracle che in MySQL.

@Espo'soluzione è anche una buona soluzione che funzionerà sia in Oracle che in MySQL se i tuoi dati non sono già in una tabella.

Commentari (0)