MySQLストレージの基本的な例外処理チュートリアル

1687 ワード

ストレージ・プロシージャがエラーを投げ出して実行を中止するのではなく、エラー・コードを返す場合があります.Mysqlは異常処理をサポートし、CONTINNUE/EXIT異常処理のHANDLERを定義することでSQLWARNING/NOT FOUND/SQLEXCEPTIONをキャプチャする(警告/データなし/その他の異常).ここで、FORの後にSQLWARNING、NOT FOUND、SQLEXCEPTIONに変更して、oracleのothersに相当するすべての異常が処理されることを示すことができます.例えば、異常処理を行わない場合、以下のコードは、ERROR 1062(23000)エラーを直接投げ出す.

CREATE PROCEDURE test_proc_ins1(
     IN i_id INT,
     IN i_name VARCHAR(100)
)
BEGIN
     INSERT INTO testproc VALUES (i_id,i_name);
     INSERT INTO testproc VALUES (i_id,i_name);
END;

異常処理後、放出エラーを回避する代わりに、戻りパラメータo_を定義することができるretは、javaコードで異常をキャプチャするのではなく、戻り値を取得することでビジネスロジックを処理できるように、失敗を表すために特別な値を付与する.たとえば、戻り値を-1に設定します.

CREATE PROCEDURE test_proc_ins1(
     IN i_id INT,
     IN i_name VARCHAR(100),
     OUT o_ret INT)
BEGIN
     DECLARE EXIT HANDLER FOR SQLSTATE '23000' set o_ret = -1;
--        :
-- DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret=-1;
     INSERT INTO testproc VALUES (i_id,i_name);
     INSERT INTO testproc VALUES (i_id,i_name);
     set o_ret = 1;
END;

もちろん、特定のSQL文については、プライマリ・キーの競合など、rollbackを指定することもできます.

DECLARE exit HANDLER FOR SQLSTATE '23000'

delimiter //

CREATE PROCEDURE TEST()
BEGIN
DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND
begin
rollback;
insert into bb values('error');
end;
START TRANSACTION;
INSERT INTO aa VALUES (1);
INSERT INTO aa VALUES (2);
COMMIT;
END;
//

CALL test()//