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;
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;
: