VARCHAR2
von Oracle behandelt leere Zeichenfolgen als NULL
.
Also
if tname != '' then
ist dasselbe wie
if tname != NULL then
was NULL
zurückgibt statt TRUE
da es nicht definiert ist.
Sie können auf NULL
prüfen von tname IS NOT NULL
.
table_name
ist in user_tables
obligatorisch Diese Prüfung ist jedoch nicht erforderlich.
Zwei weitere Dinge:
- Suchen Sie nach
%NOTFOUND
unmittelbar nach dem Abrufen - Verwenden Sie nach Möglichkeit Spaltenreferenzen für Variablendeklarationen (
user_tables.table_name%TYPE
)
Ihr Code könnte also so aussehen:
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;
Zur besseren Lesbarkeit könnten Sie auch einen impliziten Cursor verwenden:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;