Oracle:若是表存在

我正在爲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';

可是將DROPDROP綁在一塊兒的語法正在逃避我。 oracle


#1樓

只是想發佈一個完整的代碼來建立一個表,若是已經存在使用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;

#2樓

我更喜歡指定表和架構全部者。 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;
/

#3樓

可悲的是,若是存在則沒有丟棄,或者若是不存在則不會建立

您能夠編寫一個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;

#4樓

在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

#5樓

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

相關文章
相關標籤/搜索