Można tak:
begin
for rec in (select table_name
from all_tables
where table_name in ('tabela1', 'tabela2','tabela3')
)
loop
begin
execute immediate 'drop table '||rec.table_name;
exception
when others then
obsluz_wyjatek;
end;
end loop;
end;
/
- tabela2 była podana bez ciapków:
'
- Jeśli tabeli nie ma w słownikach systemowych, to powyższe zapytanie jej nie zwróci. W efekcie
execute immediate
nie wykona się dla takiej tabeli, po co więc obsługa wyjątków?
- Zupełnie ignorujesz właściciela tabel, więc będziesz próbował w ten sposób usuwać tabele, które widzisz, a niekoniecznie jesteś ich właścicielem i możesz nie mieć praw do ich usuwania. Stąd zapewne dostajesz jakieś wyjątki.
Jak dla mnie, to powinieneś wybierać ownera i table_name:
select owner,table_name from all_tables where owner='ktos' and table_name in ('t1','t2','t3')
I na tej podstawie usuwać tabele:
execute immediate 'drop table '||rec.owner||'.'||rec.table_name;
- Warto by to ubrać w procedurę i korzystać ze zmiennych, a nie hardkodowanych nazw.
- Taki
drop table
(właściwie każdy DDL) wykona:
a) zatwierdzenie bieżącej transakcji
b) usunięcie tabelki
c) powtórne zatwierdzenie transakcji (wiążący się z aktualizacją słownika systemowego)
Ta uwaga na wypadek gdybyś miał pomysły realizowania tego bloku w ramach większej transakcji.