1
resposta

Não consigo atribuir valors a variáveis quando o SELECT possui mais de um retorno?

Escrevi o código abaixo para uma atividade do dia a dia e reparei que, sempre que tento utilizar o INTO para atribuir valores as variáveis em selects com mais de um retorno, da erro de sintaxe. Acabei, por fim, por escrever diversos selects. Entretanto, queria a vossa sugestão para encurtar este código e deixá-lo mais elegante. Assim evoluo meus conhecimentos também.

CREATE DEFINER=`root`@`localhost` PROCEDURE `identifica_matricula_e_idChecklist_de_mesmo_status`(vMatricula VARCHAR(20), vNovoStatus VARCHAR(50))
BEGIN
    DECLARE vStatusVeiculo, vStatusChecklist VARCHAR(30);
    DECLARE vIdVeiculo, vIdChecklist INT;

    /*Consulta controle de verificação dos status iniciais*/
    SELECT v.id as 'ID Veiculo', v.matricula as 'Matricula', v.status as 'Status Veiculo',
        c.id as 'ID Checklist', c.status as 'Status Checklist'
    FROM veiculo v
    INNER JOIN checklist c
    ON v.id = c.idVeiculo
    WHERE v.matricula = vMatricula and v.status = c.status;

    /* Carregamento das variáveis de veículo*/
    SELECT status INTO vStatusVeiculo FROM veiculo WHERE matricula = vMatricula;

    SELECT id INTO vIdVeiculo FROM veiculo WHERE matricula = vMatricula;

    /* Carregamento das variáveis de checklist*/
    SELECT c.status INTO vStatusChecklist FROM veiculo v
    INNER JOIN checklist c
    ON v.id = c.idVeiculo
    WHERE v.matricula = vMatricula and v.status = c.status;

    SELECT c.id INTO vIdChecklist FROM veiculo v
    INNER JOIN checklist c
    ON v.id = c.idVeiculo
    WHERE v.matricula = vMatricula and v.status = c.status;

    /*Verificação intermediária - Confirmar se os campos alterados foram os mesmos da consulta inicial*/
    SELECT vIdVeiculo, vStatusVeiculo, vIdChecklist, vStatusChecklist;

    /*Atualização de status*/
    UPDATE veiculo
    SET status = vNovoStatus
    WHERE id = vIdVeiculo;

    UPDATE checklist
    SET status = vNovoStatus
    WHERE id = vIdChecklist;

    /*Verificação do status final*/
    SELECT v.id as 'ID Veiculo', v.matricula as 'Matricula', v.status as 'Status Veiculo',
        c.id as 'ID Checklist', c.status as 'Status Checklist'
    FROM veiculo v
    INNER JOIN checklist c
    ON v.id = c.idVeiculo
    WHERE v.matricula = vMatricula and v.status = c.status;

END
1 resposta

Olá, Fabio, tudo bem?

Desculpe pela demora em obter retorno.

O comando INTOé usado para atribuir valores a variáveis a partir do resultado de uma consulta. No entanto, ele espera que a consulta retorne apenas uma linha de resultado. Quando a consulta retorna mais de uma linha, ocorre um erro de sintaxe, pois o comando INTO não pode lidar com essa situação.

Se você está tentando atribuir valores a várias variáveis em um select que retorna mais de uma linha, você precisará utilizar uma estrutura de loop ou uma tabela temporária para armazenar os resultados e, em seguida, atribuir os valores às variáveis desejadas.

Uma solução para encurtar e otimizar seu código é utilizar a cláusula LIMIT para garantir que cada consulta retorne apenas uma linha. Dessa forma, você pode atribuir os valores diretamente às variáveis usando o comando INTO. Veja um exemplo de como você pode aplicar essa modificação:

/* Carregamento das variáveis de veículo */
SELECT status, id INTO vStatusVeiculo, vIdVeiculo FROM veiculo WHERE matricula = vMatricula LIMIT 1;

/* Carregamento das variáveis de checklist */
SELECT c.status, c.id INTO vStatusChecklist, vIdChecklist
FROM veiculo v
INNER JOIN checklist c ON v.id = c.idVeiculo
WHERE v.matricula = vMatricula AND v.status = c.status
LIMIT 1;

No exemplo acima, a cláusula LIMIT 1 é adicionada ao final de cada consulta. Ela garante que apenas a primeira linha de resultado será retornada.

Espero ter ajudado.

Caso surja alguma dúvida, fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software