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か月の平均に追加できることを望んでいました。
ストアドプロシージャがないと、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;
"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
も機能しますが、これらはセッション変数です。この場合、ローカルストアドプロシージャ変数を使用します(プロシージャのスコープ外で表示または変更できません)
公式ドキュメントやその他のスタック交換サイトの回答からコピーの貼り付けの例が見つかったにもかかわらず、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