2011-08-12 5 views
1

私はクエリを行うopen_loopというカーソルを持っていますが、今はループしたいのですが、保持している値がデータベースに存在するかどうかを確認します。それを挿入します。MySQLのストアドプロシージャループの問題

問題は、私がループを終了する方法は、状態02000を待つことです:Success, but no rows found。残念ながら、これはuserテーブルにエントリがない場合にも発生します。そのため、ループはすぐに切断されます。どのように私はそれがそのイベントのためにトリガされないようにすることができますが、loop_curがエントリを使い果たした場合でも引き続きトリガするか、ループを終了する別の方法を見つけるでしょうか?

私のコードはここにある:これは、私は本当に多くのより多くの値を挿入し、フェッチしていますので、簡略化され、loop_curのためのクエリはので、私はそれを含んでいませんでした、かなり複雑であるされていないしてくださいことを

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
OPEN loop_cur; 

REPEAT 

    FETCH loop_cur 
    INTO user_id, user_info 

    SELECT Id INTO user_id FROM users WHERE Id = user_id; 

    IF user_id IS NOT NULL THEN 

     UPDATE users 
     SET info = user_info 
     WHERE Id = user_id; 

    ELSE 
     INSERT INTO users (user_info); 
    END IF; 
    UNTIL done END REPEAT; 
CLOSE loop_cur; 

が、それは動作します。

最後に、INSERT ON DUPLICATE KEY UPDATEを使用することはできません。私がチェックしているのは本当にuser_idではなく、別の列です。シンプルにuser_idを使用しました。

答えて

0

ループ内でtrueに設定されているブール変数を使用します。

簡単にするために取り除か無関係なコード:

DECLARE found boolean default false; 

... 

REPEAT 

    FETCH loop_cur ... 

    SET found = true; 

    ... 

UNTIL done END REPEAT; 

-- found is now true if you got some rows, false otherwise 
+0

私が終了したかったし、私が見つけるまで、あなたが意味すると仮定し、私は、私はそれの要点を得て、似たような実装を考えるとき、あなたは一種の誤理解だと思いますそれはうまくいった。ありがとう! –