Oracles VARCHAR2
behandlar tomma strängar som NULL
.
Så
if tname != '' then
är samma som
if tname != NULL then
som returnerar NULL
istället för TRUE
eftersom det inte är definierat.
Du kan kontrollera efter NULL
av tname IS NOT NULL
.
table_name
är obligatoriskt i user_tables
dock, så det finns inget behov av denna kontroll.
Två saker till:
- Kontrollera efter
%NOTFOUND
direkt efter hämtning - Använd kolumnreferenser för variabeldeklarationer om möjligt (
user_tables.table_name%TYPE
)
Så din kod kan se ut så här:
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;
Du kan också använda en implicit markör för bättre läsbarhet:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;