7

MySQL を使用して動的にカーソルを使用するには、ストアド プロシージャのループでカーソルを宣言できますか? 私は試してみましたが、エラーが発生しました:

increment: LOOP
DECLARE cur1 CURSOR FOR SELECT person_id, publication_id  FROM p_publication WHERE person_id = new_count;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
    FETCH cur1 INTO pub_id, per_id;
IF NOT done THEN
          INSERT INTO test.t2 VALUES (pub_id, per_id);
    END IF;
SET new_count = new_count + 1;
  UNTIL done END REPEAT;

     CLOSE cur1;
IF !(new_count < old_count ) THEN LEAVE increment;
END IF;
END LOOP increment;

SQL 構文にエラーがあります。12 行目の 'DECLARE cur1 CURSOR FOR SELECT person_id, publication_id FROM person_has_public' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

前もって感謝します

4

1 に答える 1

15

BEGIN ... ENDカーソルをブロックにネストすることで、必要なことを行うことができます。詳細については、 Roland Bouman の記事「Nesting MySQL Cursor Loops」を参照してください。ネストされたカーソルを実行する代わりにクエリを書き直すことが可能な場合が多いため、この手法はしばしば不要であるという彼のコメントに注目する価値があるかもしれません。

カーソルをループ内にネストする必要がある場合、コードは次のようになります。

increment: LOOP
    block_cursor: BEGIN
        DECLARE cur1 CURSOR FOR SELECT person_id, publication_id  FROM p_publication WHERE person_id = new_count;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        OPEN cur1;
        REPEAT
            FETCH cur1 INTO pub_id, per_id;
            IF NOT done THEN
                INSERT INTO test.t2 VALUES (pub_id, per_id);
            END IF;
            SET new_count = new_count + 1;
        UNTIL done END REPEAT;
        CLOSE cur1;
        IF !(new_count < old_count ) THEN
            LEAVE increment;
        END IF;
    END block_cursor;
END LOOP increment;
于 2010-07-11T19:50:18.297 に答える