Luthien 0 Denunciar post Postado Fevereiro 27, 2016 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; end $ E essa é pra inserir carros nas vagas, porém qnd chamo a procedure aparece o erro: Result consisted of more than one row. Achei que fosse por causa do update que atualizaria todos os registros que tivessem aquela categoria, então coloquei limit = 1 e o erro continua: 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; end $ Agradeceria se alguém puder ajudar! :) Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 27, 2016 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 Compartilhar este post Link para o post Compartilhar em outros sites
Luthien 0 Denunciar post Postado Fevereiro 27, 2016 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; end $ Então pensei em uma solução, mas continuo com um problema parecido: 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? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 27, 2016 Veja o exemplo passado. Compartilhar este post Link para o post Compartilhar em outros sites
Luthien 0 Denunciar post Postado Fevereiro 27, 2016 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; end $ 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 Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 28, 2016 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; Não sei se entendi a sua lógica de criação de vagas , porque não inserir a vaga para cada carro que entre ? Compartilhar este post Link para o post Compartilhar em outros sites