Insert com Select - Procedure - [ RESOLVIDO ]

13 respostas Resolvido
mbass

Alguém conseguiria identificar o meu erro no comando abaixo:

  • Eu estou tentando montar um Insert com select c/ base nesta instrução SQL - Oracle.
  • O meu select está funcionando perfeitamente.
  • Na variável V_CODIGO_MAX eu pego o último valor da coluna e acrescento + 1 e depois passo ao insert.

BEGIN
  V_CODIGO_MAX NUMBER;

  BEGIN  
     SELECT 
      MAX(U.CODIGO) + 1 CODIGO
      INTO V_CODIGO_MAX
    FROM USUARIO U;
    
    INSERT INTO USUARIO (CODIGO, 
                         NOME_COMPLETO,
                         SENHA,
                         EMAIL,
                         USER_NOME)
        VALUES (V_CODIGO_MAX,'Teste','0502','[email removido]','Teste');

  END;
END;

A mensagem que recebo de erro é:

  • Eu já troquei a variável V_CODIGO_MAX para ficar assim > V_CODIGO_MAX := null
    mas não resolveu também.
  • Procurei em outro assuntos por aqui e não encontrei algo que pudesse me ajudar.

13 Respostas

aresmaverick

Será que ele está dando erro na inferência de tipos? Tenta usar um cast antes do INTO. Sou bem novato nessa parte, se encontrar a solução, coloque-a aqui.

drsmachado

Só com parte da procedure fica difícil adivinhar.

mbass

O código completo é só esse aí que postei.
Veja outra vez:

Não é difícil adivinhar drsMachado.

drsmachado

Bom, segundo o que consta aqui, você pode executar o comando show error procedure [NOME_DA_PROCEDURE]; e conseguirá o detalhamento dos problemas ocorridos.

mbass

DrsMachado não estou executando o código citado por uma procedure no momento.
Eu seleciono o código e executo, entendeu?
Ainda não criei a procedure ou trigger para tal.

Vlw.

pmlm

O primeiro begin não deveria ser DECLARE ?

E, consequentemente, tens um END a mais no final.

DECLARE 
    V_CODIGO_MAX NUMBER;

BEGIN
    SELECT MAX(U.CODIGO) + 1 CODIGO
      INTO V_CODIGO_MAX
      FROM USUARIO U;

    INSERT INTO USUARIO (.....)

END;
/

Porque é que usas este max +1 e não uma sequência? É que desta forma, só tens desvantagens:

  • Se não tiveres dados na tabela, não vai devolver “1”.
  • Se executares duas (ou mais) vezes em simultâneo tens boas possibilidades de obter códigos repetidos.
mbass

Pmlm corrigi esta parte e deixei como mostra a imagem abaixo, mas ainda não deu certo.

Enfim, vou continuar avaliando onde está o erro ou faltando info…

Vlw pela ajuda!

drsmachado

Ontem estava sem o sql developer.
Criei duas tabelas, apenas para testes e estou testando as possibilidades de fazer algo parecido com o que você espera funcionar e não obtive sucesso.
O que me vem em mente é que será mesmo necessário criar a procedure.
Caso realmente não queira criar a procedure, talvez concatenar as queries possa resolver, como eu fiz insert into table1(column1, column2) values ( (select (max(d.id) + 1) from departments d), 'qualquer coisa');
Talvez tentar com cursor ou algo assim funcione, mas não tentei.

mbass

Bacana drsMachado…

Vlw pela dica. Vou continuar tentando mais tarde.

Obrigado!

pmlm

O teu código está diferente do meu.

DECLARE, sem BEGIN

BEGIN é só apos a declaração das variáveis.

mbass

Fiz da forma que escreveu, mas não deu certo também…

pmlm
Solucao aceita

Falta o VALUES no INSERT

Testado aqui:

DECLARE 
    V_COD_MAX NUMBER;

BEGIN
 SELECT MAX(U.CODIGO) + 1 CODIGO
  INTO V_COD_MAX
  FROM USUARIO U;

INSERT INTO USUARIO (CODIGO, NOME, VALOR, EMAIL, DESCRICAO) 
    VALUES(V_COD_MAX, 'teste', 1, '[email removido]', 'a');
END;
/
mbass

Deu certo!

Pmlm, estranho que anteriormente eu tinha feito conforme você descreveu e não “vingou”…

Bom, decedi dropar a tabela. Realizei um insert manual e em seguida segui sua instrução, e deu certo.

Enfim, concluído! Muito obrigado!

Criado 15 de março de 2017
Ultima resposta 16 de mar. de 2017
Respostas 13
Participantes 4