MySQLのプロシージャのサンプル。初投稿です。
memberupdate.sql
#(既存プロシージャを)DROPしてからCREATEする事。DROPはDELEMITER外に書く事。
DROP PROCEDURE IF EXISTS memberupdate;
DELIMITER //
CREATE PROCEDURE memberupdate ()
BEGIN
#宣言は、変数、カーソル、ハンドラの順に行う事。そうしないとエラーが出る。
DECLARE mem_id INT;
DECLARE mem_name VARCHAR(20);
DECLARE mem_age INT;
DECLARE fetch_state INT default 0;
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 ;