私はストアプロシージャによって操作されるテーブルを作成しようとしています。 私は選択と更新を行う2つの手順があります。最初のものは完全に実行されますが、最後のものは問題があります。間違いなくmysqlパーサの問題のように感じます。私はプロジェクトの間もなく予定されているので、私はここでいくつかの助けを見つけることができれば幸いです。 2番目のspが実行されると、その後のすべての更新ステートメントは、レコードを削除するまで、SPまたは単なる基本クエリを介して失敗します。それから私は再び基本的なクエリ呼び出しを介して更新を挿入することができます。 NodeJSを実行しているWebサーバーと通信しているため、SPを使用する必要があります。私はnode-mysqlパッケージを使用しています。私はmysql-5.7を使用しています。エラーコード:1109フィールドリストの 'CONSUMER'テーブルが不明です
SECOND SP ERROR:エラーコード: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
第2の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
はい。 。選択は完全に機能しますが、2番目のSPの更新呼び出しによってエラーが発生しています。その行を削除するまでクエリを更新することはできません。 – timecatcher
奇妙な部分は、最初のSPは同様の呼び出しを行いますが問題は発生しません。以前に言及したように、mysqlパーサの問題になる可能性があります。 – timecatcher