Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

Result consisted of more than one row. Não entendi de onde vem o erro

Recommended Posts

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.