Oracle Database inkluderar inte IF EXISTS
klausul som vissa andra DBMS erbjuder i sin DROP TABLE
uttalanden. Därför, om vi vill undvika otäcka fel till följd av att vi försöker släppa en icke-existerande tabell, måste vi göra lite extra arbete.
Alternativ 1:Kontrollera om tabellen finns
Vi kan kontrollera DBA_TABLES
dataordbokvy för att se om tabellen finns. Denna vy beskriver alla relationstabeller i databasen. Dess kolumner är desamma som de i ALL_TABLES
.
Vi kan kontrollera den här tabellen för att se om tabellen finns och sedan köra DROP TABLE
uttalande om det gör det.
Exempel:
DECLARE
tbl_count number;
sql_stmt long;
BEGIN
SELECT COUNT(*) INTO tbl_count
FROM dba_tables
WHERE owner = 'HR'
AND table_name = 'T1';
IF(tbl_count <> 0)
THEN
sql_stmt:='DROP TABLE T1';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Resultat:
PL/SQL procedure successfully completed.
I det här fallet, tabellen som heter t1
existerade redan och togs bort.
Nu, om vi kör samma kod igen, får vi samma utdata:
PL/SQL procedure successfully completed.
Inget fel uppstod, även om tabellen inte längre finns.
Men om vi bara försöker släppa tabellen utan att först kontrollera om den finns, får vi ett felmeddelande:
DROP TABLE T1;
Resultat:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Alternativ 2:Testa för felet
Ett annat sätt att göra det är att helt enkelt gå vidare och köra DROP TABLE
och fånga sedan upp eventuella ORA-00942-fel som uppstår. Specifikt fångar vi alla SQLCODE -942-fel som uppstår.
Exempel:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Resultat:
PL/SQL procedure successfully completed.
Jag körde det trots att T1
tabellen fanns inte. ORA-00942-felet fångades och hanterades så vi fick inget felmeddelande.
Om tabellen redan hade funnits skulle tabellen ha tagits bort och vi skulle se samma utdata.