Porque son
param1 y
@param1 son variables diferentes.
El parámetro
param1 es una variable local del SP, y
@param1 es otra variable distinta, de las que se denomina "variable de usuario", las que son globales, permanentes, dependientes de la conexión y además carecen de tipo si no se las inicializa, siendo su valor por default NULL.
Las variables locales de un SP deben declararse en todos los casos, mientras que las variables de usuario, identificadas por su "@", empiezan a existir desde el momento en que la usas, pero como carecen de tipo de dato debes inicializarlas asignandole uno.
Ahora bien, este tipo de variables se pueden usar en un SP, pero no pertenecen a él, sino a la conexión (login del usuario) activa en ese momento. Por esta razón son invisibles para otros usuarios y también permanecen y mantienen el último valor ingresado, más allá de los SP donde se usen.
Otro detalle que debes tener en cuenta al usarlas es que cambian su valor con cada operación hecha con ella, lo que las hace aptas para usarlas
dentro de un SELECT, pero en ese caso deben ser usadas con cuidado y sólo con el operador ":=".
Nale una buena leida al manual de referencia:
MySQL :: 19 Procedimientos almacenados y funciones