VARCHAR2
da Oracle trata strings vazias como NULL
.Então
if tname != '' then
é o mesmo que
if tname != NULL then
que retornará
NULL
em vez de TRUE
pois não está definido. Você pode verificar se há
NULL
por tname IS NOT NULL
. table_name
é obrigatório em user_tables
embora, portanto, não há necessidade dessa verificação. Mais duas coisas:
- Verifique se há
%NOTFOUND
imediatamente após a busca - Use referências de coluna para declarações de variáveis, se possível (
user_tables.table_name%TYPE
)
Então seu código pode ficar assim:
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;
Você também pode usar um cursor implícito para melhor legibilidade:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;