Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Inserção de mais de um registro no mesmo comando

Gostaria de saber se é possível de uma maneira mais prática a inserção de mais de um registro no mesmo comando, na aula foi ensinado essa maneira:

INSERT INTO TB_VENDEDORES (MATRICULA, NOME, PERCENTUAL)
VALUES ('00235', 'Márcio Almeida Silva', 0.08);
INSERT INTO TB_VENDEDORES (MATRICULA, NOME, PERCENTUAL)
VALUES ('00236', 'Cláudia Morais', 0.08);

Mas eu queria saber se é possível, no Oracle, fazer inserção como no SQL Server, por exemplo:

INSERT INTO table_name (column_list)
VALUES
    (value_list_1),
    (value_list_2),
    ...
    (value_list_n);
4 respostas

Opa, tudo bem?

É possível fazer sim uma inserção em lote, de forma idêntica a que mencionou, separando os valores com vírgulas no final. No seu exemplo, seria assim:

INSERT INTO TB_VENDEDORES (MATRICULA, NOME, PERCENTUAL)
VALUES ('00235', 'Márcio Almeida Silva', 0.08),
       ('00236', 'Cláudia Morais', 0.08);

Imagino que na aula foi mostrado de forma separada por didática, para apresentar duas inserções diferentes.

Então, eu tentei executar dessa forma e não funcionou, inclusive criei uma tabela de teste para tentar e não funcionou, pois entre o fechamento do primeiro valor e a primeira vírgula fica sublinhado de rosa no SQL Developer e aponta um erro na execução. Deixarei o comando utilizado e o erro encontrado abaixo:

INSERT INTO TB_TESTE (NOME)
VALUES 
('Nome A'),
('Nome B'),
('Nome C'),
('Nome D');

Erro:

Erro na Linha de Comandos : 7 Coluna : 12
Relatório de erros -
Erro de SQL: ORA-00933: comando SQL não encerrado adequadamente
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:
solução!

Ops, desculpe-me a "má nota", havia interpretado errado e respondendo com SQL Server em mente. :P

Nos BD Oracle tem algumas formas de fazer vários inserts de uma vez, como usando o "Insert All" ou criando procedures para essa finalidade. Nesse momento, imagino que o "Insert All" seja mais relevante. Na sua tabela de teste seria assim:

INSERT ALL
            INTO TB_TESTE (NOME) VALUES ('NOME A')
            INTO TB_TESTE (NOME) VALUES ('NOME B')
            INTO TB_TESTE (NOME) VALUES ('NOME C')
SELECT * FROM dual;

Será feito um "Insert de todos os valores" e depois apresentados os resultados. A última linha pode ser substituída por algo mais genérico, como:

SELECT 1 FROM dual

Pessoal, boa noite!

Segui o mesmo algoritmo enviado pelo Pablo mas quando tentei rodar surge o seguinte erro:

ORA-00001: restrição exclusiva (SYSTEM.SYS_C00xxxxx) violada

Código utilizado:

insert all  
into tb_seller2 (matricula,nome,comissao) values ('00235','Maria M.',0.08)
into tb_seller2 (matricula,nome,comissao) values ('00236','Joao M.',0.08)
into tb_seller2 (matricula,nome,comissao) values ('00237','Roberta M.',0.11)
into tb_seller2 (matricula,nome,comissao) values ('00238','Jose M.',0.8)
SELECT 1 FROM dual;

Alguém saberia o motivo para esse erro?