我正在爲Oracle數據庫編寫一些遷移腳本,而且但願Oracle有相似MySQL的IF EXISTS
結構。 sql
具體來講,每當我想在MySQL中刪除表時,我都會這樣作 數據庫
DROP TABLE IF EXISTS `table_name`;
這樣,若是表不存在, DROP
不會產生錯誤,腳本能夠繼續。 session
Oracle是否有相似的機制? 我意識到我可使用如下查詢來檢查表是否存在 架構
SELECT * FROM dba_tables where table_name = 'table_name';
可是將DROP
與DROP
綁在一塊兒的語法正在逃避我。 oracle
只是想發佈一個完整的代碼來建立一個表,若是已經存在使用Jeffrey的代碼就放棄它(對他而言,不是我!)。 spa
BEGIN BEGIN EXECUTE IMMEDIATE 'DROP TABLE tablename'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END; EXECUTE IMMEDIATE 'CREATE TABLE tablename AS SELECT * FROM sourcetable WHERE 1=0'; END;
我更喜歡指定表和架構全部者。 code
注意區分大小寫。 (參見下面的「上部」條款)。 server
我扔了幾個不一樣的對象,以代表能夠在TABLEs以外的地方使用。 htm
............. 對象
declare v_counter int; begin select count(*) into v_counter from dba_users where upper(username)=upper('UserSchema01'); if v_counter > 0 then execute immediate 'DROP USER UserSchema01 CASCADE'; end if; end; / CREATE USER UserSchema01 IDENTIFIED BY pa$$word DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON users; grant create session to UserSchema01;
和一個TABLE示例:
declare v_counter int; begin select count(*) into v_counter from all_tables where upper(TABLE_NAME)=upper('ORDERS') and upper(OWNER)=upper('UserSchema01'); if v_counter > 0 then execute immediate 'DROP TABLE UserSchema01.ORDERS'; end if; end; /
可悲的是,若是存在則沒有丟棄,或者若是不存在則不會建立
您能夠編寫一個plsql腳原本包含邏輯。
http://download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_9003.htm
我對Oracle語法不太瞭解,但我認爲@ Erich的腳本會是這樣的。
declare cant integer begin select into cant count(*) from dba_tables where table_name='Table_name'; if count>0 then BEGIN DROP TABLE tableName; END IF; END;
在oracle中沒有'DROP TABLE IF EXISTS',你必須作select語句。
試試這個(我沒有使用oracle語法,因此若是個人變量是ify,請原諒我):
declare @count int select @count=count(*) from all_tables where table_name='Table_name'; if @count>0 BEGIN DROP TABLE tableName; END
declare c int; begin select count(*) into c from user_tables where table_name = upper('table_name'); if c = 1 then execute immediate 'drop table table_name'; end if; end;
這是用於檢查當前模式中的表是否存在。 要檢查給定表是否已存在於不一樣的模式中,您必須使用all_tables
而不是user_tables
並添加條件all_tables.owner = upper('schema_name')