选择@var永远为null

时间:2012-12-20 23:58:00

标签: 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 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,这并没有改变结果。

当我运行select id from scheme.users where 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`)
)

1 个答案:

答案 0 :(得分:1)

试试这个:

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 ;