Oracle's VARCHAR2 behandelt lege strings als NULL .
Dus
if tname != '' then
is hetzelfde als
if tname != NULL then
die NULL teruggeeft in plaats van TRUE omdat het niet gedefinieerd is.
U kunt controleren op NULL door tname IS NOT NULL .
table_name is verplicht in user_tables deze controle is echter niet nodig.
Nog twee dingen:
- Controleer op
%NOTFOUNDonmiddellijk na het ophalen - Gebruik indien mogelijk kolomverwijzingen voor variabele declaraties (
user_tables.table_name%TYPE)
Dus je code zou er zo uit kunnen zien:
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;
U kunt ook een impliciete cursor gebruiken voor een betere leesbaarheid:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;