Re: Parametros de salida en un procedimiento
La ventaja o la diferencia es que el resultado queda en una variable (ya sea de un procedimiento, o una variable de usuario) que puedes utilizar posteriormente en consultas, mientras que si haces SELECT, el resultado es devuelto en un juego de resultados, que es más difícil de explorar en MySQL. Piensa en un procedimiento almacenado que llama a otro para obtener un valor determinado. Con parámetros de salida, simplemente tienes que usar una variable local del procedimiento llamante que recoge el valor que le deja el procedimiento llamado. Si, por el contrario, utilizaras SELECT sin INTO en el procedimiento llamado, tendrías que hacer un cursor en el procedimiento llamante; sería un rollo si sólo quieres obtener un valor.
Aún así, las funciones son aún más cómodas porque se pueden utilizar en expresiones y devuelven un valor que no tienes por qué guardar en una variable. Su problema, sin embargo, es que tal y como está MySQL, las funciones no pueden devolver varios valores, y tienen ciertas serias limitaciones como no soportar recursividad o necesitar ser deterministas o sólo leer SQL si usas el binary log (backups, replicación), mientas que los procedimientos almacenados ya no tienen estas restricciones.
En cuanto a tu segunda pregunta, las variables que empiezan con una arroba, como @a, son las llamadas variables de usuario. Éstas son variables globales a toda tu sesión (independientemente de que las uses desde dentro de rutinas almacenadas), y con existencia únicamente dentro de la misma (se pierden al cerrarla), que no necesitan ser declaradas. Puedes grabarles valores con SET, SELECT INTO o como parámetros de salida en procedimientos, y puedes utilizar su valor en cualquier expresión o seleccionarlo con SELECT.
Un saludo,
Miguel Pérez
Afina Sistemas - Partner de MySQL en España