Oracle VARCHAR2
обрабатывает пустые строки как 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;