Camarada, resolvi testar, embora já soubesse que teria êxito e, consegui.
Minha procedure está assim
DELIMITER $$
DROP PROCEDURE IF EXISTS `gestloc`.`procPerc` $$
CREATE PROCEDURE `gestloc`.`procPerc` ()
BEGIN
SELECT truncate(((SELECT count(tipo) from titulo where tipo = 1 )*100/count(*)),0) FROM titulo;
END $$
DELIMITER ;
Alterei o select, pois, como o seu está, ele irá apenas contar os 3 tipos de material = utilizavel, retornando 100%.
Quando faço um subselect, aí ele conta e retorna corretamente.
Chamando call procPerc(); o resultado foi 25 (tenho 8 registros, 2 são = 1, pois 2 * 100 / 8 = 25).
Já a function
DELIMITER $$
DROP FUNCTION IF EXISTS `gestloc`.`funcPerc` $$
CREATE FUNCTION `gestloc`.`funcPerc` () RETURNS FLOAT
BEGIN
DECLARE perc float;
SELECT truncate(((SELECT count(tipo) from titulo where tipo = 1 )*100/count(*)),0) into perc FROM titulo;
return perc;
END $$
DELIMITER ;
Chamando
Resultado: 25
Para deixar a coisa mais interessante, resolvi colocar a opção de informar o tipo dinamicamente
DELIMITER $$
DROP PROCEDURE IF EXISTS `gestloc`.`procPerc` $$
CREATE PROCEDURE `gestloc`.`procPerc` (IN tipov int)
BEGIN
SELECT truncate(((SELECT count(tipo) from titulo where tipo = tipov )*100/count(*)),0) FROM titulo;
END $$
DELIMITER ;
E, chamando
call procPerc(1);
O resultado é: 25.