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