Algunos detalles:
1) Los parámetros de los SP no llevan "@", este símbolo se usa solamente para las variables de usuario que son independientes de los SP, dependen de la conexión (sesión de MySQL), y deben ser inicializados para ser usados porque carecen de tipo. Su valor inicial es NULL, por lo que al entrar al SP eso es lo que contienen: NULL.
2) Las variables locales se declaran con DECLARE. Sólo pueden se de salida las variables del prototipo, si y sólo si llevan la cláusula OUT.
3) Si al SP contiene más de una sentencia, deben usarse cambios de delimitador al inicio y al final para permitir que el mismo se cargue en un solo paso.
4) Es buena práctica poner las cláusulas IN/OUT/INOUT a cada variable del prototipo para evitar confusiones.
5) Los SP no se invocan con EXECUTE, sino con CALL.
6) Un SP no puede devolver una tabla para ser usada como fuente de datos de un SELECT. Sí puede devolver una tabla como resultado, y valores en sus variables de prototipo.
7) No se admiten rutinas recursivas en MySQL.
8) Un trigger no puede invocar un SP.
9) Hay algunas sentencias que no se pueden usar en un SP, por ejemplo: LOAD DATA INFILE.
10) Se pueden usar cursores en un SP, pero no se pueden recibir o devolver como variables, y su orden de creación en un SP no es arbitrario. Deben estar después de declarar todas las variables.
Por el resto, yo sugeriría que primero lean el manual de referencia, capítulo dedicado a los SP:
MySQL :: 19 - Procedimientos almacenados y funciones.
Luego podemos avanzar sobre el tema.