2013-05-05 98 views
1

我有一个存储过程,用于检查是否有与输入相同的电子邮件地址的用户,如果没有,则会注册一个。MySQL存储过程异常:一行被执行,另一行被跳过?

下面是表:

CREATE TABLE IF NOT EXISTS `overkill`.`accounts` (
    `accountID` INT NOT NULL AUTO_INCREMENT , 
    `email` VARCHAR(64) NOT NULL , 
    `firstName` VARCHAR(32) NOT NULL , 
    `lastName` VARCHAR(32) NOT NULL , 
    `passSaltedSHA` BINARY(20) NOT NULL , 
    `salt` BINARY(20) NOT NULL , 
    `gender` ENUM('m','f') NOT NULL , 
    `birthDate` DATE NOT NULL , 
    `regTime` TIMESTAMP NOT NULL , 
    PRIMARY KEY (`accountID`)) 
ENGINE = InnoDB; 

这里是存储过程:

DELIMITER $$ 

CREATE PROCEDURE `overkill`.`registerUser` (
    IN emailIN VARCHAR(64), 
    IN passwordIN VARCHAR(16), 
    IN firstNameIN VARCHAR(32), 
    IN lastNameIn VARCHAR(32), 
    IN birthIN DATE, 
    IN genderIN ENUM('f','m')) 

BEGIN 
    DECLARE existingMailAccLOG INT DEFAULT NULL; 
    DECLARE saltLOC CHAR(40); 
    DECLARE regSuccessLOC BOOLEAN DEFAULT FALSE; 

    SELECT COUNT(*) INTO existingMailAccLOG FROM `overkill`.`accounts` WHERE `accounts`.`email` = emailIN; 

    IF existingMailAccLOG = 0 THEN 
     SET saltLOC = SHA1(rand()); 
     SET regSuccessLOC = TRUE; 
     INSERT INTO `overkill`.`accounts` (`email`, `firstName`, `lastName`, `passSaltedSHA`, `salt`, `gender`, `birthDate`) VALUES(emailIN, firstNameIN, lastNameIn, UNHEX(SHA1(CONCAT(passwordIN, saltLOC))), UNHEX(saltLOC), genderIN, birthIN); 
    END IF; 

    SELECT regSuccessLOC AS `registered`, saltLOC AS `salt`; 
END 

如果我称之为:

CALL registerUser("[email protected]", "pass", "firstn", "lastn", "2012-01-01", "f"); 

插入线accounts表,但流连忘返,我设置IF

SET saltLOC = SHA1(rand()); 
SET regSuccessLOC = TRUE; 

里面这怎么可能正确的价值观?为什么这些行被跳过并且INSERT仍然被执行,没有错误?

+0

尝试在'IF'子句中运行'SELECT'语句,看看会发生什么:'SELECT regsuccessLOC AS'注册',saltLOC AS'盐';'看看报价! – GregD 2013-05-05 16:23:30

+0

仍然执行插入的行,但不返回任何内容。当SELECT出现时,如果没有INSERT,它将完美返回值。 INSERT有什么问题... – 2013-05-05 16:29:24

+0

如何执行proc?在'mysql'命令行客户端中,在'phpmyadmin'中,其他地方? – Quassnoi 2013-05-05 17:27:00

回答