Gebruik dynamische SQL die de datadictionary verdrijft.
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;
Het is een goed idee om precies te zijn met de LIKE-clausule; met behulp van de escape
zoekwoord om ervoor te zorgen dat underscores niet als jokertekens worden behandeld. Of gebruik substr(table_name, 1, 7) = 'PREFIX_'
.
Het laten vallen van de verkeerde tabel is geen ramp, op voorwaarde dat je met 10g of hoger werkt en de RECYCLE BIN is ingeschakeld , maar het is nog steeds beter om het niet te doen. Uiteraard zou je dergelijke code niet uitvoeren in Production, maar je zou het principe gebruiken om een script met drop-statements te genereren.
De bovenstaande code behandelt geen afhankelijkheden. Als u externe sleutels heeft die verwijzen naar de vooraf ingestelde tabellen en u wilt het laten vallen van de tabellen forceren, gebruik dan deze extra logica:
execute immediate 'drop table '|| trec.table_name ||' cascade constraint';
Dit laat de beperkingen van de refererende sleutel vallen, maar laat de (voorheen) afhankelijke tabellen achter.