A
@variable
sintaxe no MySQL denota uma variável de sessão definida pelo usuário. Você pode definir essas variáveis de usuário fora de um procedimento armazenado, mas também pode defini-las dentro de um procedimento armazenado, e o efeito é que a variável retém o valor após o retorno da chamada do procedimento. Então, no seu exemplo, o seguinte também faria a mesma coisa:
CREATE PROCEDURE emp_count_2()
BEGIN
SELECT COUNT(*) INTO @empCount FROM Employee;
END
CALL emp_count_2(); /* sets @empCount as a side-effect */
SELECT @empCount;
Não há problema em várias sessões definirem a variável de usuário dessa maneira simultaneamente, porque as variáveis de usuário têm o escopo de uma única sessão e as sessões simultâneas podem ter variáveis com o mesmo nome, mas com valores diferentes.
A sintaxe de variável sem prefixo @ é para variáveis locais para o procedimento, sejam parâmetros de procedimento, ou então variáveis locais declaradas com DECLARAR dentro do corpo do procedimento.
Esse uso que você tem, passando uma variável de usuário como parâmetro e atribuindo-a no corpo do procedimento, é útil se você quiser chamar um procedimento várias vezes e armazenar o resultado em variáveis de usuário separadas. Caso contrário, cada chamada para o procedimento substituiria o valor anterior na variável de usuário @empCount para a sessão atual.