Insert com Select - Procedure - [ RESOLVIDO ]

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','teste@admin.com.br','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.

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.

1 curtida

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

1 curtida

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

Não é difícil adivinhar 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.

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.

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.
1 curtida

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!

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.

1 curtida

Bacana drsMachado…

Vlw pela dica. Vou continuar tentando mais tarde.

Obrigado!

O teu código está diferente do meu.

DECLARE, sem BEGIN

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

1 curtida

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

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, 'a@a.aa', 'a');
END;
/
1 curtida

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!