2017-02-24 10 views
0

後、私はすでにTHEN ELSE IFで別のロジックをした、MySQLのストアドプロシージャの問題を抱えているが、私はまだ私が理解カント問題を抱えています2つのユーザ入力:user_idおよびmeet_id。このプロシージャは、'ue 'という変数を定義し、一連の検証結果(ユーザーが存在すれば、イベントが存在する場合、イベント日付が有効な場合など)を格納します。)。MySQLのストアドプロシージャのSELECT VAR間違った値がINSERT

その後、IF THEN ELSEセレクタで複数のテーブルのデータをINSERTおよびUPDATEし、検証によってSELECT 1(または0)AS結果を出力します。

しかし、私の問題は、常に「結果」として0を返すということです。私の検証変数が0の場合と同様に、INSERT ...とINSERTを削除した場合、奇妙なことが起こります。 ];行のコードの、それは私に正しい(1または0)の値を返します。

手順のコードは、このいずれかになります。事前に

CREATE DEFINER=`nwouserf`@`localhost` 
PROCEDURE `join_event`(IN `user_id` BIGINT(64), IN `event_id` INT) 
NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER 

begin 
DECLARE ue INT; 
SET ue = EXISTS(SELECT 1 FROM users WHERE fb_uid=user_id) 
     AND EXISTS(SELECT 1 FROM meetup WHERE meet_id=event_id) 
     AND EXISTS(SELECT 1 FROM meetup WHERE date > NOW() AND meet_id = event_id) 
     AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND participants <= max_participants) 
     AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id); 

IF ue = 1 THEN 

    INSERT INTO meetup_participation (fb_uid, meet_id) VALUES (user_id, event_id); 
    UPDATE users SET events_participated = events_participated + 1 WHERE fb_uid=user_id; 
    UPDATE meetup SET participants = participants + 1 WHERE meet_id=event_id; 
    SELECT 1 AS result; 

ELSEIF ue = 0 THEN 
    SELECT 0 AS result; 
ELSE 
    SELECT null AS result; 
END IF; 
end 

ありがとう! 私はしばらくこのことに執着しており、理由を理解できません。

答えて

1

OUTパラメータを定義する必要があります。最後のINパラメータの直後に、

"、OUT結果INT"

の直後に追加します。

+0

OUTパラメータとINSERTパラメータがなくてもうまくいくと思います。しかし、私が作成した他のプロシージャと同様に、あなたの答えは回避されています... SELECT SETを実行し、二重クエリを実行します。それはPHP上の唯一の問題は、私はプロシージャをコールし、出力変数を選択する必要があるので、私の意見では、複数のクエリには良い考えではない、それはクエリで失敗し、次のものに続行することがあります。 –

+0

そしてなぜこれを関数として作成しないのですか?私はあなたから聞いたことから、はるかによく見えます。 – Valentin

+0

私はMySQLの初心者ですが、間違っているかもしれませんが、これまで読んできたことから、テーブルのデータを変更するときに関数を使うべきではありません(INSERT、UPDATEは許されません)。 [リンク](http://stackoverflow.com/a/1179778/2612722) –

関連する問題