MySQLでPROCEDUREを実装してみる。

STORED PROCEDUREとは一連の処理をまとめて関数のように実行できる処理のことのようです。このSTORED PROCEDUREは一度定義するとサーバ内に格納されるので次回以降は定義なしに Callすることができます。 よく似たものの中にSTORED FUNCTIONがありますが、これとの違いは戻り値があるかないかの違いのようです。STORED FUNCTIONには戻り値がありますが,STORED PROCEDUREには戻り値がありません。

以下は、itemテーブルのうち、depositとリレーションを組んでいるitemのdeposit_dateとdeposit_amountというカラムにdepositテーブルからの入金情報を格納するPROCEDUREです。

DELIMITER //
CREATE PROCEDURE sample_procedure()
BEGIN
    DECLARE _item_id int(11);
    DECLARE _deposit_amount DECIMAL;
    DECLARE _deposit_date date;

    DECLARE done int;
    DECLARE deposit_list CURSOR FOR SELECT deposits_items.item_id, deposits.payment_date, deposits.payment_amount FROM deposits INNER JOIN deposits_items ON deposits.id = deposits_items.deposit_id;

    DECLARE EXIT HANDLER FOR NOT FOUND SET done = 0;
    SET done = 1;

    OPEN deposit_list;

    WHILE done DO
    FETCH deposit_list INTO _item_id, _deposit_date, _deposit_amount;
    UPDATE items
    SET items.deposit_date = _deposit_date, items.deposit_amount = _deposit_amount
    WHERE
      items.id = _item_id;
  END WHILE;
END
//

ここで関数が定義されたので以降はこの関数をCallすることで処理が実行されます。

CALL sample_procedure()// -- プロシージャを実行