Insert com Select - Procedure - [ RESOLVIDO ]

13 respostas Resolvido
M

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

A

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.

D

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

M

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

Não é difícil adivinhar drsMachado.

D

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

M

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.

P

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.
M

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!

D

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.

M

Bacana drsMachado…

Vlw pela dica. Vou continuar tentando mais tarde.

Obrigado!

P

O teu código está diferente do meu.

DECLARE, sem BEGIN

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

M

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

P
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;
/
M

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