mysqlでストアドプロシージャ その6 - プロシージャ内から別のプロシージャを呼ぶ 2012/09/24

mysqlでストアドプロシージャ その6 です。

プロシージャ内から別のプロシージャを呼んでみます。

ついでにトランザクションに参加してるのか調べてみました。

参考


結論としてトランザクションに含まれるようですね。

DROP PROCEDURE IF EXISTS p000;
DROP PROCEDURE IF EXISTS p007;
delimiter //
-- sub procedure
CREATE PROCEDURE p000()
BEGIN
    INSERT INTO a VALUES(0, CURRENT_TIMESTAMP());
END;
-- main procedure
CREATE PROCEDURE p007()
BEGIN
    -- 以下の実験コードは、データベースエンジンがInnoDBとき確認できます。
    -- MyISAMだとロールバックされない。
  
    -- エラーの場合 ロールバック設定
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SELECT "*** ROLLBACK!!";
        ROLLBACK;
    END;
  
    -- トランザクション開始
    START TRANSACTION;
  
    -- 呼び出されたprocedureもトランザクションに含まれるようだ
    CALL p000();
  
    -- PKの重複がおこるので、かならず失敗するのでロールバックされるはず
    INSERT INTO a SET id = last_insert_id();
    -- お決まりのコミット!!
    COMMIT;
END
//
CALL p007();-- ここで実行
DROP PROCEDURE IF EXISTS p007;
DROP PROCEDURE IF EXISTS p000;

: