0

私はmysqlカーソルを学んでいます。

以下はmysqlの手順です。実際には、テーブルAのすべての行をループし、テーブルBで関連するものをAの行ごとに「選択」したいと考えています。

ここでの問題は、内側の「選択」が空のセットを返すときにループが壊れることです。これは明らかに私が期待した動作ではありません。(現在の行が B に関連するものがない場合、 A のすべての行をループして、次の行に移動したい!)

カーソルの停止基準は次のようになることを学びましたDECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;。また、それが問題の原因であることも知っています。

しかし、この状況に対する従来の回避策は何ですか?

create procedure SOME_PROC () 
BEGIN
    DECLARE temp_id int; 
    DECLARE cursor_id CURSOR FOR select id from A;
    DECLARE stop int default 0;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1; 
    OPEN cursor_id;
        FETCH cursor_id INTO temp_id;
        while stop <> 1 do
            select B.x from B where B.id = cursor_id;
            FETCH cursor_id INTO temp_id;
        end while;
    CLOSE cursor_id; 
END
4

1 に答える 1

1

回避策: 別の BEGIN ... END ブロックに行を返さない可能性がある put SELECT ... INTO を、回避策として NOT FOUND 用の独自の CONTINUE ハンドラとともに使用します。

于 2015-12-30T14:42:23.917 に答える