Mysql 选择“不适用于存储过程”

Mysql 选择“不适用于存储过程”,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我正在处理一个用于登录用户的存储过程,需要返回玩家id。测试时提供的名称和密码是正确的,结果返回1,但playerID保持为空 `player_login` ( username TEXT CHARACTER SET utf8, txtPassword TEXT CHARACTER SET utf8, OUT playerID INTEGER, OUT result INTEGER ) BEGIN DECLARE password TEXT DEFAULT player_hash_passwor

我正在处理一个用于登录用户的存储过程,需要返回玩家id。测试时提供的名称和密码是正确的,结果返回1,但playerID保持为空

`player_login` (
username TEXT CHARACTER SET utf8,
txtPassword TEXT CHARACTER SET utf8,
OUT playerID INTEGER,
OUT result INTEGER
)
BEGIN
DECLARE password TEXT DEFAULT player_hash_password(txtPassword);
DECLARE num INTEGER DEFAULT 0;
   SELECT PlayerID INTO playerID
    FROM players
    WHERE (LOWER(players.PlayerName)=LOWER(username) OR  LOWER(players.PlayerEmail)=LOWER(username))
    AND players.PlayerPassword = password
    LIMIT 1;
...

为什么PlayerID没有被选入PlayerID?PlayerID是一个非空的自动递增整数。

您的参数与列名匹配,这是MySQL存储过程长期存在的问题。为参数使用前缀,例如:

`player_login` (
p_username TEXT CHARACTER SET utf8,
p_txtPassword TEXT CHARACTER SET utf8,
OUT p_playerID INTEGER,
OUT p_result INTEGER
)
BEGIN
DECLARE p_password TEXT DEFAULT player_hash_password(p_txtPassword);
DECLARE num INTEGER DEFAULT 0;
   SELECT p_PlayerID = playerID
    FROM players p
    WHERE (LOWER(p.PlayerName)=LOWER(p_username) OR  LOWER(p.PlayerEmail)=LOWER(p_username))
    AND p.PlayerPassword = p_password
    LIMIT 1;
.