PL\SQLブロック内でEXECUTE IMMEDIATEを使用すると、ブロック全体がすぐにコミットされます。
begin
INSERT INTO Customer ( GUID, STATUS, NAME) VALUES (1,1,'xx');
EXECUTE IMMEDIATE 'CREATE TABLE Shop
(
GUID NUMBER(16),
STATUS NUMBER(1),
NAME VARCHAR2(50 BYTE),
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING';
DBMS_OUTPUT.PUT_LINE('DONE:');
EXCEPTION -- exception handlers begin
WHEN OTHERS THEN -- handles all other errors
DBMS_OUTPUT.PUT_LINE('Error occured, rollback...');
ROLLBACK;
end;
ご存じのとおり、私はCOMMITも使用していません。上記のコードについて、
「Insert into」ステートメントは機能しますが、「create table」ステートメントは、データベースに同じ名前のテーブルがすでに存在するため、例外をスローします。
どちらもコミットステートメントがありませんでした。コードブロックが例外になり、挿入が機能し、新しい行があったことを確認したデータベースを確認したところ、ロールバックしました。コミットもロールバックも機能していないため、そこにあるべきではないと予想されていました。
例外が発生したときにどうすればロールバックできますか?.
Oracleでは、テーブルを作成するか、alterステートメントを実行すると、暗黙のコミットが行われます。 「PRAGMA AUTONOMOUS_TRANSACTION」のブール値を返す別の関数でテーブルを作成すると、呼び出し側のプロシージャは、テーブルが作成されたかどうかに関してtrue/false応答を受け取ります。その後、挿入をコミットまたはロールバックできます。