VARCHAR2
de Oracle trata cadenas vacías como NULL
.
Entonces
if tname != '' then
es lo mismo que
if tname != NULL then
que devolverá NULL
en lugar de TRUE
ya que no está definido.
Puede buscar NULL
por tname IS NOT NULL
.
table_name
es obligatorio en user_tables
sin embargo, no hay necesidad de esta verificación.
Dos cosas más:
- Busca
%NOTFOUND
inmediatamente después de buscar - Utilice referencias de columna para declaraciones de variables si es posible (
user_tables.table_name%TYPE
)
Entonces su código podría verse así:
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;
También podría usar un cursor implícito para una mejor legibilidad:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;