Mysql "No data - zero rows fetched, selected, or processed"

Olá. Eu criei a seguinte função no meu banco:

E ela está dando em uma mensagem de erro:

Obs1: O parâmetro “rifa”, que é usado no WHERE, está sendo passado corretamente.
Obs2: Testei todas as variáveis e resultados de SELECT e não tem nada nulo ou com 0. Não há nenhuma tabela vazia.

Alguém tem alguma idéia do que se passa aqui?

Não seria CALL pega_caixa('Teste');?

Acho melhor talvez postar a DDL em lugar de screenshot da IDE, pra ver melhor como esta definida a UDF. É o que deve ter na aba “Código CREATE”.

1 curtida

Não, pois é uma função e não um Stored Procedure.

Claro, aqui está:

BEGIN
DECLARE toReturn DECIMAL(4,2) DEFAULT 0;
DECLARE lucro DECIMAL(4,2) DEFAULT 0;
DECLARE rifa VARCHAR(20);
DECLARE meu_cursor CURSOR FOR SELECT lucro,nome FROM rifas;
OPEN meu_cursor;
loop1: LOOP
	FETCH meu_cursor into lucro, rifa;
	SET toReturn = (toReturn + (lucro * (SELECT COUNT(*) FROM rifas_vendidas WHERE rifa=rifa)));
END LOOP loop1;
RETURN ((toReturn + (SELECT SUM(ganho) FROM lanches_vendidos)) - (SELECT SUM(custo) FROM comprado));
END

Eu postei screenshot porque eu estou usando o Heidsql e no código não fica o tipo de retorno por exemplo. Daí eu queria mostrar isso.

Realmente, tem pouco CREATE nesse código create rsrs…

Enfim, eu acho que esse erro é devido a que o seu cursor meu_cursor ou está retornando uma conjunto vazio, ou esta passando do fim dos dados, e ao tentar colocar o resultado en lucro e rifa da erro justamente pois não há dados. Linha 8.

Confira o que é retornado ao rodar SELECT lucro, nome FROM rifas manualmente. Veja o exemplo ai sobre como tratar a condição de eof: https://dev.mysql.com/doc/refman/5.7/en/cursors.html

Eu nem me toquei que existe essa aba

Bem pensado. O problema é que eu já havia testado o SELECT, aliás, eu já testei todos os valores dessa função a procura desse erro. Eu modifiquei a função para parar quando passase um, mas tá dando no mesmo erro.

CREATE DEFINER=`root`@`localhost` FUNCTION `pega_caixa`(
	`rifa` VARCHAR(20)



)
RETURNS decimal(10,0)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE toReturn DECIMAL(4,2) DEFAULT 0;
DECLARE lucro DECIMAL(4,2) DEFAULT 0;
DECLARE rifa VARCHAR(20);
DECLARE vezes SMALLINT DEFAULT 0;
DECLARE meu_cursor CURSOR FOR SELECT lucro,nome FROM rifas;
OPEN meu_cursor;
loop1: LOOP
	IF (SELECT COUNT(nome) FROM rifas) < vezes THEN
		LEAVE loop1;
	END IF;
	FETCH meu_cursor into lucro, rifa;
	SET toReturn = (toReturn + (lucro * (SELECT COUNT(*) FROM rifas_vendidas WHERE rifa=rifa)));
	SET vezes = vezes+1;
END LOOP loop1;
RETURN ((toReturn + (SELECT SUM(ganho) FROM lanches_vendidos)) - (SELECT SUM(custo) FROM comprado));
END

Agora eu peguei o código CREATE :+1:

Ve no link que te passei acima como é usada a variavel done como condição de parada.

Eu vi sim, e foi o que eu usei como base pra fazer o IF. Mas qual é a diferença? Minha condição tende a funcionar igual a do link, não?

Estou analisando o problema desde então, e ainda não encontrei uma solução. Enquanto isso, eu vou fazer uma solução direto no código mesmo.