web-dev-qa-db-ja.com

Whileループの方法

MySQLでwhileループをどのように使用できますか?私のテストスクリプト:

BEGIN
    SELECT 0 INTO @n;
    WHILE @n < 10 DO
    SELECT @n;
    SET @n := @n +1;
    END WHILE;
END;

ただし、構文エラーがあります。標準のクエリウィンドウでSQLyogクライアントを使用してループを実行しています。構文エラーは次の形式です。

エラーコード:1064
SQL構文にエラーがあります。近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください...

https://dev.mysql.com/doc/refman/5.6/en/while.html で提供されているwhileループの例を使用しようとしましたが、それでも機能しませんでした。

スクリプトのどの部分が間違っていますか? (MySQL 5.6を使用。)

一部のデータの6か月の移動平均を作成しようとしているので、whileループがループの各反復を通じて「新しい」6か月の平均を「古い」6か月の平均に追加できることを望んでいました。

7

ストアドプロシージャがないと、SQLエディターでforループを実行できません。私が使う MySQL Workbenchこれを作る。

クイックストアドプロシージャがその仕事をするはずです。

DROP PROCEDURE IF EXISTS proc_loop_test;
CREATE PROCEDURE proc_loop_test()
BEGIN
  DECLARE int_val INT DEFAULT 0;
  test_loop : LOOP
    IF (int_val = 10) THEN
      LEAVE test_loop;
    END IF;

    SET int_val = int_val +1;
    SELECT int_val; 
  END LOOP; 
END;
10
oNare

"while"ループを明確にするためにdo作業:

ストアドプロシージャを作成する必要がある(たとえば、Oracleのように匿名ブロックを実行できない)と、「ジェネリック」SQLエディターではうまく機能しないことがあります(PL/SQLは常に機能しないため)まあどちらか)

MySQL Workbenchまたはコマンドラインも使用できます。

16:54 [test]:> delimiter $$
16:54 [test]:> create procedure testwhile ()
    -> begin
    ->   declare n int;
    ->   set n:=0;
    ->   while n <10 do
    ->     select n;
    ->     set n := n+1;
    ->   end while;
    -> end;
    -> $$
Query OK, 0 rows affected (0.00 sec)
16:54 [test]:> delimiter ;
16:54 [test]:> call testwhile();
[...]

補足として、@variablesも機能しますが、これらはセッション変数です。この場合、ローカルストアドプロシージャ変数を使用します(プロシージャのスコープ外で表示または変更できません)

5
phil_w

公式ドキュメントやその他のスタック交換サイトの回答からコピーの貼り付けの例が見つかったにもかかわらず、mysqlワークベンチからの構文エラーの紛らわしい問題で問題が発生しました。複数の行に分割された(人間が読みやすいように)長いクエリがある場合は、区切り文字を使用して、マシンに改行が「意味のある」ものであることを明確にする必要がある場合があります。

Mysqlワークベンチで構文的に受け入れられた手順の複数行クエリの例(編集されていますが)。

DELIMITER //
DROP PROCEDURE IF EXISTS methodLoop;
CREATE PROCEDURE methodLoop(p1 INT)
BEGIN
    label1: LOOP
        SET p1 = p1-1;
        IF p1 > 0 THEN

            SELECT *
            FROM Table1 foo
            LEFT JOIN Table 2 bar ON foo.id = bar.id;

        END IF;

    END LOOP label1;
END//

DELIMITER ;

call methodLoop(10);

https://stackoverflow.com/questions/52412225/mysql-create-insert-procedure-statement-incomplete

0
user1821961