Usuwanie tabel w pętli PL/SQL

0
begin
  for rec in (select table_name 
              from   all_tables 
              where  table_name in ('tabela1', tabela2,'tabela3')                               
             )
  loop
    execute immediate 'drop table '||rec.table_name;    
  end loop;

end;
/

Jak do powyższego kodu dodać wyjątek, który w przypadku gdyby w pętli natrafiono na nieistniejącą tabele, ignorował to i przechodził do próby usunięcia następnej tabeli ?

0

Google mówią coś o takim warunku

EXCEPTION
         WHEN OTHERS THEN
                IF SQLCODE != -942 THEN
                     RAISE;
                END IF;
0

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;
/
  1. tabela2 była podana bez ciapków: '
  2. 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?
  3. 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;

  1. Warto by to ubrać w procedurę i korzystać ze zmiennych, a nie hardkodowanych nazw.
  2. 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.

0

Zawartość z

where  table_name in ('tabela1', 'tabela2','tabela3') 

czyli 'tabela1', 'tabela2','tabela3' jest totalnie przykładową zawartością. Chodzi mi tylko o to jak obsłużyć wyjątek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1