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
%NOTFOUNDunmittelbar 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;