2016-09-22 14 views
0

私はストアプロシージャによって操作されるテーブルを作成しようとしています。 私は選択と更新を行う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 
+0

テーブルが存在する同じDBにプロシージャを作成していますか? – Rahul

+0

はい。 。選択は完全に機能しますが、2番目のSPの更新呼び出しによってエラーが発生しています。その行を削除するまでクエリを更新することはできません。 – timecatcher

+0

奇妙な部分は、最初のSPは同様の呼び出しを行いますが問題は発生しません。以前に言及したように、mysqlパーサの問題になる可能性があります。 – timecatcher

答えて

0

大変申し訳ございません。私のトリガーファイルは1500行のコードです。私はCONSUMER.loggedInを呼び出すことによってトリガーに間違いを起こしました。ありがとうございます

関連する問題