Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fiz duas funções, uma pra preencher todas as vagas do estacionamento como desocupadas e outra para inserir carro nas vagas, dando update
Essa é pra criar 50 vagas desocupadas
delimiter $
create procedure InsereDadosVagaDesocupada()
begin
declare cont int default 0;
while (cont < 50) do
insert into Vaga (Status,IDCategoria) values ('DESOCUPADA',floor(1+rand()*4));
set cont = cont +1;
end while;delimiter $
create procedure InsereDadosVagaOcupada()
begin
declare vPlaca varchar(45);
declare vCategoria int;
declare cont int default 0;
declare vQtd int default 0;
select count(*) from Carro into vQtd;
while (cont < vQtd) do
select PlacaCarro,IDCategoria into vPlaca,vCategoria from Carro;
update Vaga set PlacaCarro = vPlaca where Vaga.IDCategoria = vCategoria limit 1;
set cont = cont +1;
end while;Agradeceria se alguém puder ajudar! :)
Verdade! foi lerdeza da minha parte, o select estava gerando aquele erro, aí limitei:
select PlacaCarro,IDCategoria into vPlaca,vCategoria from Carro limit 1;
Mas ainda estaria com problema, pois td vez que chamar essa procedure, ela vai sempre pegar apenas o primeiro carro, aí tentei fazer desse jeito mas não estava alterando nenhum registro da Vaga:
delimiter $
create procedure InsereDadosVagaOcupada()
begin
declare vPlaca varchar(45);
declare vCategoria int;
declare cont int default 0;
declare vQtd int default 0;
declare vAux int;
select count(*) into vQtd from Vaga;
while (cont < vQtd) do
select IDCategoria into vAux from Vaga limit 1;
select PlacaCarro,IDCategoria into vPlaca,vCategoria from Carro where Carro.IDCategoria = vAux limit 1;
update Vaga set PlacaCarro = vPlaca, Status = 'OCUPADA' where Vaga.IDCategoria = vCategoria limit 1;
set cont = cont +1;
end while; select IDCategoria into vAux from Vaga where IDVaga = cont + 1;
Assim eu percorro todas as vagas mas não percorro todos os carros, não sei como consertar. Existem alguma maneira de não verificar os q já foram verificados?Veja o exemplo passado.
Não sei se entendi bem a ideia mas tentei e deu errado, está alterando apenas 4 registro da categoria 1 na tabela Vaga e aparece o warning " 0 row(s) affected, 1 warning(s): 1329 No data - zero rows fetched, selected, or processed":
delimiter $
create procedure InsereDadosVagaOcupada()
begin
declare existe_mais_linhas int default 0;
declare vPlaca varchar(45);
declare vCategoria int;
declare vID int;
/*define as variáveis que serão selecionadas de Carro*/
declare cursor1 cursor for select PlacaCarro,IDCategoria from estacionamento.Carro;
declare cursor2 cursor for select IDVaga from estacionamento.Vaga;
/*define o valor para 1 se não existir mais linhas*/
declare continue handler for not found set existe_mais_linhas = 1;
/*abre o cursor*/
open cursor1;
open cursor2;
/*inicia o loop*/
simple_loop:loop
/*define onde os valores selecionados serão inseridos*/
fetch cursor1 into vPlaca,vCategoria;
fetch cursor2 into vID;
/*se não existir mais linhas sai do loop*/
if existe_mais_linhas = 1 then
leave simple_loop;
end if;
/*atualiza a tabela de acordo com os dados selecionados*/
update Vaga set PlacaCarro = vPlaca, Status = 'OCUPADA' where Vaga.IDCategoria = vCategoria and IDVaga = vID;
end loop simple_loop;
/*fecha o cursor*/
close cursor1;
close cursor2;Fiz uns comentários do q entendi, se n for pedir muito você poderia explicar se entendi alguma coisa errado? Eu tenho só 4 categorias, acho q isso tem alguma relação com o erro já que alterou apenas 4 registros
Creio que será algo assim
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b, c INT;
DECLARE cur1 CURSOR FOR select PlacaCarro,IDCategoria into vPlaca,vCategoria from Carro;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
declare cont int default 0;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO a, b;
IF done THEN
LEAVE read_loop;
END IF;
set cont = cont +1;
update Vaga set PlacaCarro = vPlaca where Vaga.IDCategoria = cont;
END LOOP;
CLOSE cur1;
END;
O seu select usado no insert retorna mais de uma linha , isto não pode num "select into" vaja nesta documentação um exemplo de um CURSOR.
http://dev.mysql.com/doc/refman/5.7/en/cursors.html