BのエラーとAでの掴み方次第でしょう
ロジカルなエラー(たとえばカーソルが一巡したみたいな)以外の
普通のエラーがBで発生したら、不正終了するのが限界だと思います。
以前の質問でこういうのがありました
sample
Bの処理のデータ登録で処理が失敗
失敗の種類によりますね
で、まず拾いたいエラーを確認します。
たとえば、tbl_bのプラマリー設定をして重複エラーになる場合
エラー: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
メッセージ: '%s' はキー %d で重複しています
ということで"23000"を拾えば分岐に使えます。
SQL
1create table tbl_a(id int primary key auto_increment,val int);
2insert into tbl_a values(1,100),(2,110),(3,120);
3create table tbl_b(id int primary key,val int);
4insert into tbl_b values(1,200),(2,210),(3,220);
SQL
1drop procedure if exists proc_b;
2delimiter //
3create procedure proc_b()
4begin
5insert into tbl_b values(4,430);
6end
7//
8delimiter ;
※tbl_bに対してprimary keyを指定して投入します。
今回はid=4なので、1回めは成功し、2回目以降は失敗します
上記踏まえproc_aを作成します
SQL
1drop procedure if exists proc_a;
2delimiter //
3create procedure proc_a()
4begin
5declare done int default 0;
6declare continue handler for sqlstate '23000' set done = 1;
7call proc_b;
8if done=0 then
9insert into tbl_a(val) values(130);
10end if;
11end
12//
13delimiter ;
※命題ではトランザクションをロールバックするような記載でしたが
そもそもproc_bがエラーステータス23000を返してこないときだけ投入すればいいでしょう
実行
1回目は成功するので、tbl_a,tbl_bそれぞれにレコードが1つずつ増えます。
再度proc_aをコールします。
2回目はproc_bが失敗するのでproc_aもinsert 処理をしません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/04 11:16
2019/09/04 11:45
2019/09/04 11:48
2019/09/06 01:50