VARCHAR2
di Oracle tratta le stringhe vuote come NULL
.
Allora
if tname != '' then
è uguale a
if tname != NULL then
che restituirà NULL
invece di TRUE
poiché non è definito.
Puoi controllare NULL
di tname IS NOT NULL
.
table_name
è obbligatorio in user_tables
tuttavia, quindi non è necessario questo controllo.
Altre due cose:
- Cerca
%NOTFOUND
subito dopo il recupero - Utilizza i riferimenti alle colonne per le dichiarazioni delle variabili, se possibile (
user_tables.table_name%TYPE
)
Quindi il tuo codice potrebbe assomigliare a questo:
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;
Potresti anche usare un cursore implicito per una migliore leggibilità:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;