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
%NOTFOUND
immé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;