1
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"문은 예외를 throw합니다.
둘 다 커밋 문과 코드 블록이 없어서 예외가 발생하여 데이터베이스가 삽입 된 것을 확인하고 새로운 행이있을 때 롤백되었습니다. 커밋 및 롤백이 없기 때문에 거기에 없어야합니다.
예외가 발생할 때 어떻게 롤백 할 수 있습니까?
이것은 오라클에서 DDL이 transactionnal이 아니기 때문입니다. 참조 : [Oracle : DDL 및 트랜잭션 롤백] (http://stackoverflow.com/questions/4711447/oracle-ddl-and-transaction-rollback). 'EXECUTE IMMEDIATE'는 커밋하지 않지만'CREATE TABLE'는 커밋합니다. –