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仍然被執行,沒有錯誤?
嘗試在'IF'子句中運行'SELECT'語句,看看會發生什麼:'SELECT regsuccessLOC AS'註冊',saltLOC AS'鹽';'看看報價! – GregD 2013-05-05 16:23:30
仍然執行插入的行,但不返回任何內容。當SELECT出現時,如果沒有INSERT,它將完美返回值。 INSERT有什麼問題... – 2013-05-05 16:29:24
如何執行proc?在'mysql'命令行客戶端中,在'phpmyadmin'中,其他地方? – Quassnoi 2013-05-05 17:27:00