web-dev-qa-db-ja.com

Oracle-単一のクエリで複数のテーブルを削除する

データベースに50のテーブルがあり、必要なテーブルは6つだけです。

1つのクエリで残りのテーブルを削除するにはどうすればよいですか?

10
vim

以下のクエリでDROP TABLEコマンドのリストを生成できます。

_SELECT 'DROP TABLE ' || table_name || ';' FROM user_tables;
_

その後、保持する6つのテーブルを削除し、他のコマンドを実行します。または、クエリにWHERE table_name NOT IN (...)句を追加します。

それが役に立てば幸い。

21
DirkNM

Oracleにはこれを行う直接のコマンドや方法がないため、このようなものを使用してください

begin
  for rec in (select table_name 
              from   all_tables 
              where  table_name like '%ABC_%'
             )
  loop
    execute immediate 'drop table '||rec.table_name;
  end loop;             
end;
/
10
Deepu

答えを拡大すると、Oracle 10バージョン以降では、削除されたテーブルは完全に削除されるのではなく、ごみ箱に移動されます。テーブルを本当に削除するには、オプションのパラメータPURGEを追加する必要があります。

受け入れられた答えの拡張:

SELECT 'DROP TABLE ' || table_name || ' PURGE ;' DB_DEATH FROM user_tables;
2
Peter
  1. 左側のリストから、ドロップするすべてのテーブルを選択します。それらをワークシートにドラッグアンドドロップします。ポップアップウィンドウからオブジェクト名を選択します
  2. [編集]メニューを押して、[置換]を選択します。
  3. 検索フィールドにコンマ記号,を入力します
  4. 置換フィールドに次のテキスト;\ndrop tableを入力します。 Wordテーブルの後にスペースがあることに注意してください。すべてを交換してください。
  5. 最初のテーブルの前にdrop tableを入力し、最後のテーブルの後に;を入力します。
  6. テーブルを削除する準備が整いました。
1
user6585581

最初に、保持したいテーブル名でこのクエリを実行します。

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
AS statement FROM information_schema.tables 
WHERE table_schema = 'mydatabase' AND table_name not in ('table1', 'table2', 'table3');

このクエリは、DROPテーブルクエリを提供します。

1
Ankur R
DECLARE 
  TYPE bulk_array is table of ALL_TABLES.TABLE_NAME%type; 
  array bulk_array;
BEGIN

 SELECT OWNER ||'.'|| TABLE_NAME BULK COLLECT 
   INTO array
   FROM ALL_TABLES 
  WHERE TABLE_NAME LIKE '%%';--HERE U WILL PUT YOUR CONDITIONS.


    FOR i IN array.FIRST..array.LAST LOOP
       EXECUTE IMMEDIATE 'DROP TABLE '|| array(i) || ' PURGE'; --Specify PURGE if you want to drop the table and release the space associated
    END LOOP; 
END;
0