Utilisez SQL dynamique pour piloter le dictionnaire de données.
begin
for trec in ( select table_name
from user_tables
where table_name like 'PREFIX\_%' escape `\' )
loop
dbms_output.put_line('dropping table ' || trec.table_name);
execute immediate 'drop table '||trec.table_name;
end loop;
end;
C'est une bonne idée d'être précis avec la clause LIKE; en utilisant la escape
mot-clé pour s'assurer que les traits de soulignement ne sont pas traités comme des caractères génériques. Vous pouvez également utiliser substr(table_name, 1, 7) = 'PREFIX_'
.
La suppression de la mauvaise table n'est pas un désastre à condition que vous travailliez sur 10g ou version ultérieure et la CORBEILLE est activée , mais il vaut mieux ne pas le faire. Évidemment, vous n'exécuteriez pas de code comme celui-ci en production, mais vous utiliseriez le principe pour générer un script d'instructions drop.
Le code ci-dessus ne gère pas les dépendances. Si vous avez des clés étrangères faisant référence aux tables préfixées et que vous souhaitez forcer la suppression des tables, utilisez cette logique supplémentaire :
execute immediate 'drop table '|| trec.table_name ||' cascade constraint';
Cela supprime les contraintes de clé étrangère mais laisse les (anciennement) tables dépendantes.