web-dev-qa-db-ja.com

PL \ SQLブロック内でのEXECUTE IMMEDIATEの使用

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」ステートメントは、データベースに同じ名前のテーブルがすでに存在するため、例外をスローします。

どちらもコミットステートメントがありませんでした。コードブロックが例外になり、挿入が機能し、新しい行があったことを確認したデータベースを確認したところ、ロールバックしました。コミットもロールバックも機能していないため、そこにあるべきではないと予想されていました。

例外が発生したときにどうすればロールバックできますか?.

1
osman

Oracleでは、テーブルを作成するか、alterステートメントを実行すると、暗黙のコミットが行われます。 「PRAGMA AUTONOMOUS_TRANSACTION」のブール値を返す別の関数でテーブルを作成すると、呼び出し側のプロシージャは、テーブルが作成されたかどうかに関してtrue/false応答を受け取ります。その後、挿入をコミットまたはロールバックできます。

2
Gandolf989