Estoy buscando una buena manera de realizar inserciones de varias filas en una base de datos Oracle 9. Lo siguiente funciona en MySQL pero no parece ser compatible con 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');
sequnce.nextval
, ya que está prohibido enunion
deselect
. En cambio podemos ir conINSERT ALL
.En Oracle, para insertar varias filas en la tabla t con las columnas col1, col2 y col3, puede usar la siguiente sintaxis:
fuente
SELECT 1 FROM DUAL
hace.INSERT ALL
requiere unaSELECT
subconsulta. Para evitar eso,SELECT 1 FROM DUAL
se usa para dar una sola fila de datos ficticios.Use SQL * Loader. Se necesita un poco de configuración, pero si esto no es único, vale la pena.
Crear mesa
Crear CSV
Crear archivo de control del cargador
Ejecute el comando SQL * Loader
Confirmar inserción
SQL * Loader tiene muchas opciones y puede tomar casi cualquier archivo de texto como entrada. Incluso puede incluir los datos en su archivo de control si lo desea.
Aquí hay una página con más detalles -> SQL * Loader
fuente
fruit_id "fruit_seq.nextval"
en la definición de columnaSiempre que necesito hacer esto, construyo un bloque PL / SQL simple con un procedimiento local como este:
fuente
Si ya tiene los valores que desea insertar en otra tabla, puede Insertar desde una instrucción select.
De lo contrario, puede enumerar un montón de declaraciones de inserción de una sola fila y enviar varias consultas en masa para ahorrar tiempo para algo que funcione tanto en Oracle como en MySQL.
La solución de @Espo también es buena y funcionará tanto en Oracle como en MySQL si sus datos aún no están en una tabla.
fuente
puede insertar usando el bucle si desea insertar algunos valores aleatorios.
fuente
También se pueden usar cursores, aunque es ineficiente. La siguiente publicación de stackoverflow analiza el uso de cursores:
INSERTAR y ACTUALIZAR un registro utilizando cursores en Oracle
fuente
Aquí hay una guía paso a paso muy útil para insertar múltiples filas en Oracle:
https://livesql.oracle.com/apex/livesql/file/content_BM1LJQ87M5CNIOKPOWPV6ZGR3.html
El último paso:
fuente
En mi caso, pude usar una simple instrucción de inserción para insertar en masa muchas filas en TABLE_A usando solo una columna de TABLE_B y obtener los otros datos en otra parte (secuencia y un valor codificado):
Resultado:
etc.
fuente