Un poco de SQL básico: Cuando capturas un parámetros o varios, siemrpe que solamente te devuelva un registro, la sentencia no es
SELECT X=loquesea, porque eso es una comparación que te debería dar TRUE o FALSE.
La sentencia para volcar el resultado de un registro a una variable es
SELECT X INTO variable FROM TABLA;
o bien
SELECT X FROM TABLA INTO variable;
Además de eso, la función que encadena variables no es "+" sino CONCAT(),
Cuando sumas directamente los contenidos de variables de dferente tipo, se hacen conversiones implícitas que pueden dar resultados inesperados, y si alguna de esas contiene un NULL, el resultado simplemente será NULL.
Por otro lado, te cuento que el tipo TINYINT es riesgoso, porque solamente te deja un rango de 0 a 255 en UNSIGNED y -128 a +127 en SIGNED. Es muy corto.
De modo que en principio la cosa sería:
Código sql:
Ver originalCREATE PROCEDURE SP_NUEVROL (IN nomrol VARCHAR(50), IN descrol VARCHAR(150))
BEGIN
DECLARE contador TINYINT;
DECLARE codigonuevo TINYINT;
DECLARE cadenaceros VARCHAR(3);
DECLARE contcodigo VARCHAR(3);
DECLARE ultimo VARCHAR(3);
DECLARE nuevocod VARCHAR(3);
SET nuevocod = 'R00';
SELECT contador = COUNT(idrol) FROM MRoles;
IF contador = 0 THEN
SET nuevocod = 'R01';
ELSE
SELECT MAX(idrol) FROM MRoles INTO ultimo;
SET contcodigo = RIGHT(ultimo,2);
SET contador = contcodigo;
SET contador = contador + 1;
SET cadenaceros =
REPEAT('0', 2 - LENGTH(contador));
SET nuevocod = CONCAT('R', cadenaceros, contador);
END IF;
INSERT INTO MRoles(idrol, nomrol, descrol) VALUES (nuevocod, nomrol, descrol);
END;