Usuwanie tabel w pętli PL/SQL

Usuwanie tabel w pętli PL/SQL
Mariusz Latek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0
Kopiuj
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 ?

Mariusz Latek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Google mówią coś o takim warunku

Kopiuj
EXCEPTION
         WHEN OTHERS THEN
                IF SQLCODE != -942 THEN
                     RAISE;
                END IF;
YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
0

Można tak:

Kopiuj
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.

Mariusz Latek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Zawartość z

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.