2013-04-23 12 views
0

是否可以停用在Oracle數據庫上創建,刪除,重命名和更改語句之後調用的隱式提交?可能停用Oracle上的隱式提交嗎?

簡單的例子:

CREATE TABLE TEST.test2x (id NUMBER(10,0)); 
ALTER TABLE TEST1.test2x ADD PRIMARY KEY (id); 

因爲架構是錯誤的,但現在已經創建了表這將失敗的ALTER語句。 那麼是否有可能繞過這種行爲,只使用create,alter等方法提交全部或全部內容?

+1

[在事務中包裝Oracle模式更新](http://stackoverflow.com/questions/59303/wrap-an-oracle-schema-update-in-a-transaction)以及http:/ /stackoverflow.com/questions/730621/do-ddl-statements-always-give-you-an-implicit-commit-or-can-you-get-an-implicit?rq=1 – Thilo 2013-04-23 08:58:52

+1

不,你不能讓DDL交易在Oracle中。 – 2013-04-23 11:31:04

回答

0

您可以在plsql「begin/end」塊內運行這些命令。然後捕捉並處理錯誤。

即。

begin 
    execute immediate 'create table xyz (x number)'; 
    execute immediate 'alter table bad.xyz add'; 
exception 
    when others then 
    execute immediate 'drop table xyz'; 
end; 
2

有辦法做到「全有或全無」的DDL,但只有在非常有限的方式 - CREATE SCHEMA聲明。

例如,以下CREATE SCHEMA語句嘗試創建兩個表,即T1T2。但是,T2的DDL不正確。這兩個表都不會被創建。

SQL> REM Verify the tables do not already exist. 
SQL> SELECT * FROM T1; 
SELECT * FROM T1 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> SELECT * FROM T2; 
SELECT * FROM T2 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> CREATE SCHEMA AUTHORIZATION TEST 
    2  CREATE TABLE T1 
    3  (
    4   X NUMBER PRIMARY KEY 
    5  ) 
    6  CREATE TABLE T2 
    7  (
    8   -- Try to reference a column that does not exist. 
    9   X NUMBER REFERENCES T1(Y) 
10  ); 
     X NUMBER REFERENCES T1(Y) 
       * 
ERROR at line 9: 
ORA-02428: could not add foreign key reference 
ORA-00904: "Y": invalid identifier 


SQL> REM Verify the tables still don't exist. 
SQL> SELECT * FROM T1; 
SELECT * FROM T1 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> SELECT * FROM T2; 
SELECT * FROM T2 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

然而,CREATE SCHEMA是有限的,因爲它僅支持CREATE TABLECREATE VIEWGRANT語句。