Използвайте динамичен SQL, управляващ речника на данните.
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;
Добра идея е да бъдете точни с клаузата LIKE; използвайки escape
ключова дума, за да се гарантира, че долните черти не се третират като заместващи знаци. Като алтернатива използвайте substr(table_name, 1, 7) = 'PREFIX_'
.
Изтриването на грешна таблица не е бедствие, при условие че работите на 10g или по-нова версия и кошчето за РЕЦИКЛИРАНЕ е активирано , но все пак е по-добре да не го правите. Очевидно не бихте изпълнили код като този в Production, но бихте използвали принципа за генериране на скрипт от изявления за изпускане.
Горният код не обработва зависимости. Ако имате външни ключове, препращащи към таблиците с префикс и искате да принудите премахването на таблиците, използвайте тази допълнителна логика:
execute immediate 'drop table '|| trec.table_name ||' cascade constraint';
Това премахва ограниченията на външния ключ, но оставя (предишните) зависими таблици.