Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kursory Oracle 9i - masowe kasowanie obiektów BD
Forum PHP.pl > Forum > Bazy danych > Oracle
lucas06
Cześć!

Mam problem z kursorami pod Oracle 9i.
Otóż chce zrobic taką rzecz, która bedzie mi kasować jakieś obiekty stworzone w bazie
np. table, które uzyskam po wypisaniu polecenia:
"SELECT tname FROM tab;"

Tak wygląda moja anonimowa deklaracja z wykorzystaniem kursora

declare
nazwa_tab varchar(30);
cursor del is select tname from tab;

begin
open del;

loop
fetch del into nazwa_tab;
exit when del%notfound;

drop table nazwa_tab;

dbms_output.put_line('Usunieto tabele '|| nazwa_tab);
end loop;

close del;

end;
/

po wykonaniu której otrzymuję nastepujacy komunikat:

BŁĄD w linii 12:
ORA-06550: linia 12, kolumna 3:
PLS-00103: Napotkano symbol "DROP" gdy oczekiwano jednego z następujących:
begin case declare end exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge
<a single-quoted SQL string> pipe

No i własnie tu pojawia sie problem uzyciem polecenia DROP, nie wiem dlaczego Oracle nie przyjmuje go.
Próbowałem umieścic to polecenie w dodatkowym bloku BEGIN ... END; ale tez nie pomogło.
Po wyrzuceniu tej instrukcji wszytko działa poprawnie!

Moje pytanie brzmi, co robię źle?questionmark.gif oraz czy dobrze odwołuję się do zmiennej nazwa_tab
w instrukcji "DROP TABLE nazwa_tab;" znajdującej się w deklaracji?questionmark.gif

Za wszytkie podpowiedzi, odpowiedzi i słowa krytyki dziekuję z góry!!!
KILIUSZKIN
Cytat(lucas06 @ 10.10.2006, 21:08:54 ) *
drop table nazwa_tab;

Poprawne polecenie drop table to: drop table NAZWA_TABELI,
gdzie nazwa tabeli nie może być zmienną, która zawiera nazwę tabeli, tylko nazwą tabeli pisaną wprost.
Musisz inaczej rozwiązać ten problem....
Synaps
  1. declare
  2. nazwa_tab varchar(30);
  3. cursor del IS SELECT tname FROM tab; begin open del;
  4.  
  5. loop
  6. fetch del INTO nazwa_tab; exit when del%notfound;
  7.  
  8. EXECUTE IMMEDIATE ' DROP TABLE ' || nazwa_tab;
  9.  
  10. dbms_output.put_line('Usunieto tabele '|| nazwa_tab);
  11. end loop;
  12.  
  13. close del;
  14.  
  15. end;
  16. /


W PL/SQL nie można jawnie wykorzystywać DROP/ALTER itd. Aby uzyskać ten efekt należy użyć składni

  1. EXECUTE IMMEDIATE l_zapytanie;
lucas06
Witam ponownie!

Panie i Panowie czapki z głów ...
Serdeczne dzięki Synaps exclamation.gif! smile.gif

Wprowadziłem kilka poprawek i teraz to działa tak jak to powinno być!

declare
nazwa_tab varchar2(30);
cursor del_tab is select tname from tab where tabtype='TABLE';

begin
open del_tab;

loop
fetch del_tab into nazwa_tab;
exit when del_tab%notfound;

EXECUTE IMMEDIATE ' DROP TABLE ' || nazwa_tab || ' cascade constraints';

dbms_output.put_line('Usunieto tabele '|| nazwa_tab);
end loop;

close del_tab;

end;
/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.