VARCHAR2
на Oracle третира празните низове като NULL
.
И така
if tname != '' then
е същото като
if tname != NULL then
което ще върне NULL
вместо TRUE
тъй като не е дефиниран.
Можете да проверите за NULL
от tname IS NOT NULL
.
table_name
е задължително в user_tables
въпреки това, така че няма нужда от тази проверка.
Още две неща:
- Проверете за
%NOTFOUND
веднага след извличане - Използвайте препратки към колони за декларации на променливи, ако е възможно (
user_tables.table_name%TYPE
)
Така че вашият код може да изглежда така:
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;
Можете също така да използвате скрит курсор за по-добра четливост:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;