Estou procurando uma boa maneira de executar inserções de várias linhas em um banco de dados Oracle 9. O seguinte funciona no MySQL, mas não 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');
sequnce.nextval
vez que é proibido emunion
deselect
. Em vez disso, podemos prosseguirINSERT ALL
.No Oracle, para inserir várias linhas na tabela t com as colunas col1, col2 e col3, você pode usar a seguinte sintaxe:
fonte
SELECT 1 FROM DUAL
faz.INSERT ALL
requer umaSELECT
subconsulta. Para contornar isso,SELECT 1 FROM DUAL
é usado para fornecer uma única linha de dados fictícios.Use o SQL * Loader. É preciso um pouco de configuração, mas se isso não acontecer, vale a pena.
Criar a tabela
Criar CSV
Criar arquivo de controle do carregador
Execute o comando SQL * Loader
Confirmar inserção
O SQL * Loader tem muitas opções e pode receber praticamente qualquer arquivo de texto como entrada. Você pode até alinhar os dados em seu arquivo de controle, se desejar.
Aqui está uma página com mais alguns detalhes -> SQL * Loader
fonte
fruit_id "fruit_seq.nextval"
na definição de colunaSempre que preciso fazer isso, construo um bloco PL / SQL simples com um procedimento local como este:
fonte
Se você já possui os valores que deseja inserir em outra tabela, poderá inserir a partir de uma instrução select.
Caso contrário, você pode listar várias instruções de inserção de linha única e enviar várias consultas em massa para economizar tempo para algo que funcione no Oracle e no MySQL.
A solução da @Espo também é boa que funcionará no Oracle e no MySQL se seus dados ainda não estiverem em uma tabela.
fonte
você pode inserir loop usando se desejar inserir alguns valores aleatórios.
fonte
Cursores também podem ser usados, embora sejam ineficientes. A seguinte postagem stackoverflow discute o uso de cursores:
INSERIR e ATUALIZAR um registro usando cursores no oracle
fonte
Aqui está uma orientação passo a passo muito útil para inserir várias linhas no Oracle:
https://livesql.oracle.com/apex/livesql/file/content_BM1LJQ87M5CNIOKPOWPV6ZGR3.html
O último passo:
fonte
No meu caso, consegui usar uma instrução de inserção simples para inserir em massa muitas linhas em TABLE_A usando apenas uma coluna de TABLE_B e obtendo os outros dados em outro lugar (sequência e um valor codificado):
Resultado:
etc
fonte