LoginSignup
13
15

More than 5 years have passed since last update.

MySQLのプロシージャのサンプル

Last updated at Posted at 2014-11-29

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 ;

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15