Mysql 选择@var始终为空

Mysql 选择@var始终为空,mysql,stored-functions,Mysql,Stored Functions,好的,这是我的mysql函数 DELIMITER $$ CREATE DEFINER=`root`@`%` FUNCTION `password_reset_request`(spUsername VARCHAR(120)) RETURNS varchar(255) CHARSET utf8 BEGIN DECLARE vcode VARCHAR(255); DECLARE muid INTEGER; SET vcode = "test"; select id

好的,这是我的mysql函数

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `password_reset_request`(spUsername VARCHAR(120)) RETURNS varchar(255) CHARSET utf8
BEGIN
    DECLARE vcode VARCHAR(255);
    DECLARE muid INTEGER;
    SET vcode = "test";

    select id into muid from scheme.users where username=@spUsername limit 1;

    RETURN muid;

    IF muid is null THEN
        RETURN 'BADUSER';
    ELSE
        insert into `password_reset`(`uid`,`code`) 
            values ( muid,vcode)
        ON DUPLICATE KEY UPDATE
            `code`=vcode;
        RETURN vcode;
    END IF;
END
我的问题是
muid
总是
null
。我甚至用
@muid
替换了所有
muid
,这并没有改变结果

当我运行
时,从scheme.users中选择id,其中username=@spUsername limit 1
并将
@spUsername
替换为我传递给函数的相同值,它为我提供了正确的信息

我还输入了
RETURN@spUsername
,以验证变量设置是否正确,是否正确

有什么想法吗?可能是在做傻事

表格方案

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(120) NOT NULL,
  `email` varchar(200) NOT NULL,
  `password` varchar(200) NOT NULL,
  `vcode` varchar(120) NOT NULL,
  `isverified` bit(1) DEFAULT b'0',
  `verifydate` datetime DEFAULT NULL,
  `date_created` datetime DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username_UNIQUE` (`username`)
)

CREATE TABLE `password_reset` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `code` varchar(255) NOT NULL,
  `iscompleted` bit(1) DEFAULT b'0',
  `date_created` datetime DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid_UNIQUE` (`uid`)
)
试试这个:

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `password_reset_request`(_spUsername VARCHAR(120)) RETURNS VARCHAR(255) CHARSET utf8
    READS SQL DATA
BEGIN
    DECLARE _vcode VARCHAR(255);
    DECLARE _muid INT(10) DEFAULT 0;
    SET vcode = "test";

    SELECT id INTO _muid 
    FROM scheme.users 
    WHERE username = _spUsername 
    LIMIT 1;

    IF _muid = 0 THEN
        RETURN 'BADUSER';
    ELSE
        INSERT INTO `password_reset`(`uid`,`code`) 
            VALUES ( _muid, _vcode)
        ON DUPLICATE KEY UPDATE
            `code` = _vcode;
        RETURN _vcode;
    END IF;
END$$

DELIMITER ;
试试这个:

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `password_reset_request`(_spUsername VARCHAR(120)) RETURNS VARCHAR(255) CHARSET utf8
    READS SQL DATA
BEGIN
    DECLARE _vcode VARCHAR(255);
    DECLARE _muid INT(10) DEFAULT 0;
    SET vcode = "test";

    SELECT id INTO _muid 
    FROM scheme.users 
    WHERE username = _spUsername 
    LIMIT 1;

    IF _muid = 0 THEN
        RETURN 'BADUSER';
    ELSE
        INSERT INTO `password_reset`(`uid`,`code`) 
            VALUES ( _muid, _vcode)
        ON DUPLICATE KEY UPDATE
            `code` = _vcode;
        RETURN _vcode;
    END IF;
END$$

DELIMITER ;

看起来是添加
读取SQL数据
和将
其中的username=@spUsername
更改为
其中的username=spUsername
的组合实现了这一点。谢谢。看起来像是添加
读取SQL数据
和将
WHERE username=@spUsername
更改为
WHERE username=spUsername
的组合,成功了。非常感谢。