広告

posted by fanblog
「ここにブログの名前を入れます」は更新を終了しました。記事はすべて新ブログ「Big Bang」に移転済みです。記事のタイトルをクリックすると新ブログの該当記事に移動します。そちらでお楽しみください。

MySQLのストアドプロシージャでIF文のインデントはNGぽい

ハロウィンの運命」というアプリを作ってみたんだけど
MySQLのストアドプロシージャ記述でハマりました。

どこが間違っているのかどうしてもわからずにいろいろやってみたんだけど、
ずっとエラーが解消されない。大雑把に書くとかんなかんじ。

ちなみに、ひとつ目のSELECTとふたつ目のSELECTは対象のテーブルが違います。
最初のSELECTでパラメーターの確認をして、正しければ本来の処理を行なうという内容です。

delimiter //
CREATE PROCEDURE fortune(OUT _s VARCHAR(2048), IN _u VARCHAR(128))
BEGIN
IF (SELECT COUNT(*) FROM fortune_type WHERE name=_u) = 0 THEN
	SELECT '"type" パラメーターが間違っています' INTO _s;
ELSE
	IF (SELECT COUNT(*) FROM fortune_name WHERE name=_u) = 1 THEN
		DELETE FROM fortune_saved WHERE name=_u;
	END IF;
(中略)
END IF;
END;
//
delimiter ;

これを、ブロックごとに分けて登録してみるとすんなりOKになる。
どうも文法的には間違っていないっぽい。

IF文のネストがあったので、そこを字下げしてたんだけど
試しにと思って、インデントを削除してみたらすんなり入った。

IFの前にはインデントをつけたらいけないみたいです。

これだとOKになる。

delimiter //
CREATE PROCEDURE fortune(OUT _s VARCHAR(2048), IN _u VARCHAR(128))
BEGIN
IF (SELECT COUNT(*) FROM fortune_type WHERE name=_u) = 0 THEN
	SELECT '"type" パラメーターが間違っています' INTO _s;
ELSE
IF (SELECT COUNT(*) FROM fortune_name WHERE name=_u) = 1 THEN
	DELETE FROM fortune_saved WHERE name=_u;
END IF;
(中略)
END IF;
END;
//
delimiter ;

新ブログ「Big Bang」で続きを読む