はにまログ

「はにまる」のようにゆるーく生きたい。

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 ;