2014-05-22 1 views
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합니다.

둘 다 커밋 문과 코드 블록이 없어서 예외가 발생하여 데이터베이스가 삽입 된 것을 확인하고 새로운 행이있을 때 롤백되었습니다. 커밋 및 롤백이 없기 때문에 거기에 없어야합니다.

예외가 발생할 때 어떻게 롤백 할 수 있습니까?

+5

이것은 오라클에서 DDL이 transactionnal이 아니기 때문입니다. 참조 : [Oracle : DDL 및 트랜잭션 롤백] (http://stackoverflow.com/questions/4711447/oracle-ddl-and-transaction-rollback). 'EXECUTE IMMEDIATE'는 커밋하지 않지만'CREATE TABLE'는 커밋합니다. –

답변

3

이 PL/SQL 코드를 타이 수 있습니다

begin 

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:'); 

INSERT INTO Customer (GUID, STATUS, NAME) VALUES (1,1,'xx'); 

EXCEPTION -- exception handlers begin 
    WHEN OTHERS THEN -- handles all other errors 
    DBMS_OUTPUT.PUT_LINE('Error occured, rollback...'); 

ROLLBACK; 
end; 

을 그래서 첫째 예외가 트랜잭션을 롤백하고 문이 작동하지 않습니다 삽입합니다 발생할 경우는, 테이블을 생성합니다. 이게 당신을 위해서 일할 수 있기를 희망합니다 ..