トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-89 SavePointで原子性を制御

SQLパズル

TableA    TableB
ID        ID
--        --
 1         7
 2         8
           9
          10

TableBのIDをTableAにinsertしてから、
TableBのIDをdeleteする(トランザクションの原子性はID単位で保持)

更新結果(IDが8と9のデータでエラーを発生させます)
TableA    TableB
ID        ID
--        --
 1         8
 2         9
 7
10


データ作成スクリプト

create table TableA(ID number(2));
insert into TableA values(1);
insert into TableA values(2);

create table TableB(ID number(2));
insert into TableB values(7);
insert into TableB values(8);
insert into TableB values(9);
insert into TableB values(10);
commit;


SQL

create or replace procedure test(pID TableA.ID%type) Is
begin
    savepoint a;
    insert into TableA select ID from TableB where ID = pID;
    if pID = 8 then
        raise_application_error(-20101,'例外');
    end if;

    delete from TableB where ID = pID;
    if pID = 9 then
        raise_application_error(-20101,'例外');
    end if;
exception
    when others then
        rollback to a;
end;
/


実行結果

begin
    for i in 7..10 Loop
        test(i);
    end Loop;
    commit;
end;
/

解説

savepointを使って、
トランザクションの原子性を制御できます