Use o SQL dinâmico acionando o dicionário de dados.
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;
É uma boa ideia ser preciso com a cláusula LIKE; usando o
escape
palavra-chave para garantir que os sublinhados não sejam tratados como curingas. Como alternativa, use substr(table_name, 1, 7) = 'PREFIX_'
. Descartar a tabela errada não é um desastre, desde que você esteja trabalhando em 10g ou posterior e a lixeira está habilitada , mas ainda é melhor não. Obviamente, você não executaria um código como este em Produção, mas usaria o princípio para gerar um script de instruções drop.
O código acima não lida com dependências. Se você tiver chaves estrangeiras referenciando as tabelas prefixadas e quiser forçar a eliminação das tabelas, use esta lógica adicional:
execute immediate 'drop table '|| trec.table_name ||' cascade constraint';
Isso elimina as restrições de chave estrangeira, mas deixa as tabelas (anteriormente) dependentes.