Oracle VARCHAR2
zachází s prázdnými řetězci jako s NULL
.
Takže
if tname != '' then
je stejný jako
if tname != NULL then
což vrátí NULL
místo TRUE
protože to není definováno.
Můžete zkontrolovat NULL
od tname IS NOT NULL
.
table_name
je povinný v user_tables
tuto kontrolu však není potřeba.
Další dvě věci:
- Vyhledejte
%NOTFOUND
ihned po načtení - Pokud je to možné, použijte pro deklarace proměnných odkazy na sloupce (
user_tables.table_name%TYPE
)
Váš kód by tedy mohl vypadat takto:
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;
Pro lepší čitelnost můžete také použít implicitní kurzor:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;