2011-03-16 72 views
3

我想刪除在已共同的名字添加到每個表的末尾一個例子的表空間某些表:Oracle |刪除表

TABLE1_NAME1_COMMON 
TABLE2_NAME2_COMMON 
TABLE3_NAME3_COMMON 

我聽說了甲骨文的功能,但我不熟悉多與那些讓我我期待着一些幫助。

謝謝。

回答

9

如果你完全確信你在做什麼,也就是說,如果你確定,你不小心掉落,你不想刪除表,你可以做:

set serveroutput on size 1000000 

begin 
for r in (

    select table_name 
    from user_tables 
    where table_name like '%\_COMMON' escape '\') 

loop 

    execute immediate 'drop table ' || r.table_name; 

end loop; 
exception when others then 
    dbms_output.put_line(sqlerrm); 
end; 
/

編輯

  1. 改變現在從user_tables而不是dba_tables選擇,因爲它似乎更安全的做法。
  2. 中順序加入set serveroutput ondbms_output.put_line,以便被打印
  3. 添加begin .. exception .. end爲要顯示的錯誤。
+0

這給了我一個錯誤 – Switch 2011-03-16 12:33:56

+0

非常感謝,它的工作就像一個魅力:) :) – Switch 2011-03-16 13:03:51

+0

我可以問這是PL/SQL的東西嗎?或功能? – Ascendant 2013-07-24 01:27:46

3

你可以做,在一個過程,但它可能是最好只選擇那些DROP -statements,審查這些和手動執行它們:

SELECT 'DROP TABLE ' || table_name || ';' 
FROM user_tables 
WHERE table_name LIKE '%\_COMMON' ESCAPE '\'; 

將返回

DROP TABLE TABLE1_NAME1_COMMON; 
DROP TABLE TABLE2_NAME2_COMMON; 
DROP TABLE TABLE3_NAME3_COMMON; 
0

以確定他們可以使用:

SELECT * FROM user_tables WHERE tablespace_name='MySpace' AND table_name like '%COMMON'; 

然後,您可以使用SELECT來派生您的DROP語句。或者你可以編寫一個PL/SQL函數來遍歷「公共表」,並使用EXECUTE IMMEDIATE刪除它們。

但我會確保你在選擇中首先100%確定。