Insert com n registros utilizando loop FOR

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
cristhianlor
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qui, 04 Mar 2010 12:24 am
Localização: SP

Fala Mestres, boa noite!

Estou montando um bloco anônimo onde preciso realizar um insert com 10 registros de uma vez utilizando o loop for e estes registros sejam comitados de 5 em 5.

Nesta tabela tenho 3 registros gravados (1..3) e não estou conseguindo realizar o insert, porque estou tendo um erro de violação na constraint. Gostaria de uma ajuda de vocês, para indicar se esta faltando algo no meu código.

Selecionar tudo


declare

v_cod_marca     marca.cod_marca%type := 4;
v_des_marca     marca.des_marca%type := 'MARCA';

begin
for x in 4..14
    loop
        insert into marca (cod_marca, des_marca)
         values (v_cod_marca, v_des_marca);
        if mod (x,5) = 0 then
        commit;
        end if;
    end loop;
commit;
end;

Relatório de erros -
ORA-00001: restrição exclusiva (LORENZO.MARCA PK) violada
ORA-06512: em line 9
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.
cristhianlor
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qui, 04 Mar 2010 12:24 am
Localização: SP

cristhianlor escreveu:Fala Mestres, boa noite!

Estou montando um bloco anônimo onde preciso realizar um insert com 10 registros de uma vez utilizando o loop for e estes registros sejam comitados de 5 em 5.

Nesta tabela tenho 3 registros gravados (1..3) e não estou conseguindo realizar o insert, porque estou tendo um erro de violação na constraint. Gostaria de uma ajuda de vocês, para indicar se esta faltando algo no meu código.

Selecionar tudo


declare

v_cod_marca     marca.cod_marca%type := 4;
v_des_marca     marca.des_marca%type := 'MARCA';

begin
for x in 4..14
    loop
        insert into marca (cod_marca, des_marca)
         values (v_cod_marca, v_des_marca);
        if mod (x,5) = 0 then
        commit;
        end if;
    end loop;
commit;
end;

Relatório de erros -
ORA-00001: restrição exclusiva (LORENZO.MARCA PK) violada
ORA-06512: em line 9
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.
Mestres, bom dia!

Pesquisando um pouco melhor, fiz uma alteração no trecho do código, incluindo um select para buscar o último registro gravado e o código foi executado com sucesso! Da maneira anterior, neste tipo de insert com vários registros, tenho que atrelar um select no loop?

Selecionar tudo


--Exercício Capítulo 4 - Ex 1;
declare

v_cod_marca     marca.cod_marca%type := 4;
v_des_marca     marca.des_marca%type := 'MARCA';

begin
for x in 4..14
    loop
      select nvl(max(cod_marca),3)+1
      into v_cod_marca
      from marca;   
      insert into marca (cod_marca, des_marca)
        values (v_cod_marca, v_des_marca);
      if mod (x,5) = 0 then
      commit;
      end if;
    end loop;
commit;
end;

Procedimento PL/SQL concluído com sucesso.

Selecionar tudo

 COD_MARCA DES_MARCA                                         
---------- --------------------------------------------------
         1 FORD                                              
         2 FIAT                                              
         3 GM                                                
         4 MARCA                                             
         5 MARCA                                             
         6 MARCA                                             
         7 MARCA                                             
         8 MARCA                                             
         9 MARCA                                             
        10 MARCA                                             
        11 MARCA                                             

 COD_MARCA DES_MARCA                                         
---------- --------------------------------------------------
        12 MARCA                                             
        13 MARCA                                             
        14 MARCA                                             

14 linhas selecionadas.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bom, pra gente conseguir ajudar melhor, precisamos saber exatamente o que o seu exercício está pedindo.
Eu não acho que esteja correto inserir 10 vezes a palavra "MARCA".
cristhianlor
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qui, 04 Mar 2010 12:24 am
Localização: SP

dr_gori escreveu:
Seg, 06 Jan 2020 1:45 pm
Bom, pra gente conseguir ajudar melhor, precisamos saber exatamente o que o seu exercício está pedindo.
Eu não acho que esteja correto inserir 10 vezes a palavra "MARCA".
Dr. Gori, tudo bem? Consegui resolver o problema fazendo um ajuste no insert, onde era necessário utilizar uma função de concatenação dos registros ID e a decrição MARCA.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 7 visitantes