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.
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.
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