VARCHAR2
Oracle traktuje puste ciągi jako NULL
.
Więc
if tname != '' then
jest taki sam jak
if tname != NULL then
co zwróci NULL
zamiast TRUE
ponieważ nie jest zdefiniowany.
Możesz sprawdzić NULL
przez tname IS NOT NULL
.
table_name
jest obowiązkowe w user_tables
jednak, więc nie ma potrzeby tego sprawdzania.
Jeszcze dwie rzeczy:
- Sprawdź
%NOTFOUND
natychmiast po pobraniu - Użyj referencji do kolumn dla deklaracji zmiennych, jeśli to możliwe (
user_tables.table_name%TYPE
)
Twój kod może wyglądać tak:
DECLARE
tname user_tables.table_name%TYPE;
CURSOR ctable IS SELECT table_name FROM user_tables;
BEGIN
OPEN ctable;
LOOP
FETCH ctable INTO tname;
EXIT WHEN ctable%NOTFOUND;
EXECUTE IMMEDIATE 'drop table ' || tname;
END LOOP;
CLOSE ctable;
END;
Możesz także użyć ukrytego kursora dla lepszej czytelności:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;