0
我正在尋找一個通過存儲過程操作的表。 我有2個程序可以選擇和更新。第一個執行完美,但最後一個有問題。它絕對感覺像MySQL解析器問題。我希望我能在這裏找到一些幫助,因爲一個項目即將到期。一旦第二個sp運行,無論是通過SP還是隻是基本查詢,每個後續更新語句都會失敗,直到我刪除該記錄;然後我可以再次插入然後通過基本查詢調用進行更新。我需要使用SP,因爲我正在與運行NodeJS的Web服務器進行通信。我正在使用node-mysql包。我正在使用mysql-5.7。錯誤代碼:1109字段列表中的未知表'CONSUMER'
第二SP錯誤:錯誤代碼1109未知表中的字段列表 '消費者'
感謝, timecatcher
表模式
CREATE TABLE IF NOT EXISTS CONSUMER (
signUpVerified BIT(1),
signUpTimeStamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
loggedIn BIT(1),
loginTimeStamp TIMESTAMP NOT NULL,
consumerName VARCHAR(100),
consumerEmail VARCHAR(254) UNIQUE NOT NULL,
consumerPassword VARCHAR(20) NOT NULL,
consumerAddress VARCHAR(100),
consumerMapLocation VARCHAR(50),
consumerMobileNumber VARCHAR(20) UNIQUE NOT NULL,
consumerBalance FLOAT,
lastSessionID BINARY(32),
consumerID INT(30) UNIQUE AUTO_INCREMENT NOT NULL,
PRIMARY KEY(consumerID)
);
FIRST SP
CREATE DEFINER=`root`@`%` PROCEDURE `CONSUMER_SIGN_UP_VERIFICATION`(IN lastSessionID BINARY(32), IN consumerEmail VARCHAR(254))
BEGIN
IF ((consumerEmail IS NULL) OR (lastSessionID IS NULL)) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "EMAIL ADDRESS & SESSION ID REQUIRED";
END IF;
IF (EXISTS(SELECT * FROM CONSUMER WHERE (CONSUMER.consumerEmail = consumerEmail) AND (CONSUMER.signUpVerified = b'0'))) THEN
IF ((SELECT CONSUMER.signUpTimeStamp FROM CONSUMER WHERE CONSUMER.consumerEmail = consumerEmail) = CHECK_SESSION_ID(lastSessionID, CONCAT("SANTEX", consumerEmail))) THEN
UPDATE CONSUMER SET CONSUMER.signUpVerified = b'1' WHERE CONSUMER.consumerEmail = consumerEmail;
ELSE
DELETE FROM CONSUMER WHERE CONSUMER.consumerEmail = consumerEmail;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "THIS SIGN UP VERIFICATION EMAIL SETUP HAS BEEN TAMPERED WITH, SO PLEASE START A NEW ACCOUNT";
END IF;
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "THIS ACCOUNT IS ALREADY REGISTERED OR THERE IS NO ACCOUNT REGISTERED WITH THIS EMAIL ADDRESS";
END IF;
END
SECOND SP
CREATE DEFINER=`root`@`%` PROCEDURE `CONSUMER_LOGIN`(IN consumerEmail VARCHAR(254), IN consumerPassword VARCHAR(20), OUT lastSessionID BINARY(32))
BEGIN
IF (EXISTS(SELECT * FROM CONSUMER WHERE (CONSUMER.consumerEmail = consumerEmail) AND (CONSUMER.signUpVerified = b'1'))) THEN
IF (EXISTS(SELECT * FROM CONSUMER WHERE (CONSUMER.consumerEmail = consumerEmail) AND (CONSUMER.consumerPassword = consumerPassword))) THEN
SELECT @consumerID := CONSUMER.consumerID FROM CONSUMER NATURAL JOIN CONSUMER_SESSION WHERE (CONSUMER.consumerEmail = consumerEmail) AND (CONSUMER.consumerPassword = consumerPassword) AND ((CONSUMER.loggedIn = b'1') OR ((CONSUMER_SESSION.loginTimeStamp != CONSUMER_SESSION.logoutTimeStamp) AND (CONSUMER_SESSION.logoutTimeStamp IS NULL)));
IF (@consumerID IS NULL) THEN
SET @loginTimeStamp := NOW();
SET lastSessionID = CREATE_SESSION_ID(@loginTimeStamp, CONCAT("SANTEX", consumerEmail));
UPDATE CONSUMER SET CONSUMER.loggedIn = b'1', CONSUMER.lastSessionID = lastSessionID WHERE (CONSUMER.consumerEmail = consumerEmail) AND (CONSUMER.consumerPassword = consumerPassword);
INSERT INTO CONSUMER_SESSION(CONSUMER_SESSION.consumerID, CONSUMER_SESSION.loginTimeStamp, CONSUMER_SESSION.sessionID, CONSUMER_SESSION.logoutTimeStamp) VALUES(@consumerID, @loginTimeStamp, lastSessionID, NULL);
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "THIS ACCOUNT HAS NOT LOGGED OUT FROM ITS PREVIOUS SESSION OR REQUESTED A PASSWORD RESET. PLEASE TRY AGAIN LATER";
END IF;
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "INCORRECT EMAIL ADDRESS OR PASSWORD";
END IF;
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "THERE IS NO ACCOUNT REGISTERED WITH THIS EMAIL ADDRESS OR SIGN UP VERIFICATION PENDING";
END IF;
END
你是否在表中存在的同一個DB中創建過程? – Rahul
是的。 。選擇工作正常,但第二個SP上的更新呼叫導致錯誤;那麼它將不會讓我更新查詢,直到我刪除該行。 – timecatcher
奇怪的是,第一個SP進行類似的調用,但沒有問題;就像我之前提到的那樣,它可能是mysql解析器問題。 – timecatcher