Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> kursory Oracle 9i - masowe kasowanie obiektów BD
lucas06
post 10.10.2006, 22:08:54
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 10.10.2006

Ostrzeżenie: (0%)
-----


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!!!
Go to the top of the page
+Quote Post
KILIUSZKIN
post 11.10.2006, 11:27:42
Post #2





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 26.01.2006

Ostrzeżenie: (0%)
-----


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


--------------------
________________________________________________________________________________
czy programiści używają jeszcze diagramów ? jeśli nie, to tylko zwykli koderzy są ;)
Go to the top of the page
+Quote Post
Synaps
post 11.10.2006, 14:02:40
Post #3





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 1.12.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


  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;


--------------------
MySQL said:

You have an error in your SQL syntax near ' `sygnatura` VARCHAR, NOT NULL
Go to the top of the page
+Quote Post
lucas06
post 11.10.2006, 18:13:11
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 10.10.2006

Ostrzeżenie: (0%)
-----


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;
/
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 22:38