J'ai 50 tables dans une base de données, en ce sens que je n'ai besoin que de six tables.
Comment puis-je supprimer les tables restantes par une seule requête?
Vous pouvez générer une liste de commandes DROP TABLE avec la requête ci-dessous:
SELECT 'DROP TABLE ' || table_name || ';' FROM user_tables;
Ensuite, supprimez les six tables que vous souhaitez conserver et exécutez les autres commandes. Ou vous ajoutez une clause WHERE table_name NOT IN (...)
à la requête.
J'espère que ça aide.
Utilisez quelque chose comme ceci, car il n'y a pas de commande directe ni de moyen dans 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;
/
Pour développer la réponse, Pour les versions Oracle 10 et ultérieures, les tables supprimées ne sont pas supprimées définitivement, mais déplacées vers le chutier recyclé. Pour supprimer réellement les tables, vous devez ajouter le paramètre facultatif PURGE.
En développant la réponse acceptée:
SELECT 'DROP TABLE ' || table_name || ' PURGE ;' DB_DEATH FROM user_tables;
Commencez par exécuter cette requête avec les noms de table que vous souhaitez conserver.
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');
Cette requête vous donnera une requête dans la table DROP.
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;
,
;\ndrop table
. Notez qu'il y a un espace après le tableau Word. Remplace tout.drop table
avant votre première table et ;
après votre dernière.