MySQLストアドプロシージャのサンプル1
ストアドを久々に作ったら色々と忘れてました…。
サンプルに解説を付けておけば判り易く覚えられそう。
#既存プロシージャがあれば DROP してから CREATE する事。 #DROP は DELEMITER 外に書く事。 DROP PROCEDURE IF EXISTS memberupdate; DELIMITER // CREATE PROCEDURE memberupdate () BEGIN #宣言は、変数、カーソル、ハンドラの順に行わないとエラーが出る。 #他にもDATE、CHARなどの型も利用できる。 DECLARE mem_id INT; DECLARE mem_name VARCHAR(20); DECLARE mem_age INT; DECLARE fetch_state INT default 0; #カーソルはSELECT文をそのまま利用できる。 DECLARE cur_member CURSOR FOR SELECT uid, name, age FROM member; #ループの終了判別にエラーハンドラを利用している。 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET fetch_state = 1; OPEN cur_member; #ラベル名:の後ろには半角スペースを入れる事。 label1: REPEAT #MySQLのプロシージャには配列が無い。 #だから、カーソルのループ内で、値を取り出してで更新処理を行っている。 #一時テーブルを作る方法もあるが、結構面倒なので。 FETCH cur_member INTO mem_id, mem_name, mem_age; IF NOT fetch_state THEN UPDATE member SET name = CONCAT(mem_name, 'さん'), age = mem_age + 1 WHERE uid = mem_id; END IF; counter=counter+1; IF mem_id=2 THEN #LEAVEで特定ラベルのループを抜ける事ができる。 #この例では単一のループなのであまり意味が無いが、 #入れ子でループしている場合に効果あり。 LEAVE labl1; END IF; UNTIL fetch_state END REPEAT label1; CLOSE cur_member; #最後のENDの後ろにセミコロンを入れない事。 END // #末尾DELIMITERと;の間には半角スペースを入れる事。 DELIMITER ;