La cosa tiene varios errores:
1. Un store procedure no devuelve valores con RETURN. Eso lo hace un Store Function, que no es lo mismo. Además en el prototipo del SF debe ir el tipo de dato devuelto.
2. El condicional IF/ELSE está incompleto. Lee el
manual de referencia para ponerlo correctamente; el cierre de IF es THEN, y además te has olvidado el delimitador de sentencia en el END IF... el cual no has puesto.
3. Poner un valor en una variable, que puede darte NULL, es inecesario si luego vas a usar un IS NULL. Lo puedes hacer dentro del IF.
4. Te has complicado innecesariamente para hacer la creación del código, usando EXTRACT para obtener un valor que puedes controlar con YEAR(). Por otro lado, si extraes un codigo viejo, este, por la forma que lo has planeado, contiene un número que no comienza con cero, por lo que simplemente lo puedes manejar como entero, lo que es más sencillo.
La idea, finalmente, sería algo así:
Código sql:
Ver originalDELIMITER $$
DROP FUNCTION IF EXISTS generaCodigoFA $$
CREATE FUNCTION generaCodigoFA() RETURNS VARCHAR(50)
READS SQL DATA
BEGIN
DECLARE codigoMax VARCHAR(50);
DECLARE nuevoCodigo VARCHAR(50);
IF (SELECT MAX(T_CodigoFichaAdm) FROM fichainscripcionadm)IS NULL THEN
SET nuevoCodigo = CONCAT('A',YEAR(NOW()),'0001');
ELSE
SET codigoMax = (SELECT MAX(T_CodigoFichaAdm) FROM fichainscripcionadm);
SET nuevoCodigo = (CONCAT('A',CAST(RIGHT(codigoMax,8) AS UNSIGNED INTEGER) + 1));
END IF;
RETURN nuevoCodigo;
END $$
DELIMITER ;
Como método me parece algo rústico y propenso a errores. Creo que deberías tratar de resolver esto dentro del código de la aplicación, y no dejarlo a la base de datos.
Pero es sólo una opinión.
Pruébalo y me cuentas.