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
%NOTFOUNDinmediatamente 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;