VARCHAR2 d'Oracle traite les chaînes vides comme NULL .
Alors
if tname != '' then
est le même que
if tname != NULL then
qui renverra NULL au lieu de TRUE puisqu'il n'est pas défini.
Vous pouvez vérifier NULL par tname IS NOT NULL .
table_name est obligatoire dans user_tables cependant, il n'y a donc pas besoin de cette vérification.
Deux autres choses :
- Vérifier
%NOTFOUNDimmédiatement après la récupération - Utilisez des références de colonne pour les déclarations de variables si possible (
user_tables.table_name%TYPE)
Donc votre code pourrait ressembler à ça :
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;
Vous pouvez également utiliser un curseur implicite pour une meilleure lisibilité :
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;