Oracle Database bevat niet de IF EXISTS
clausule die sommige andere DBMS'en aanbieden in hun DROP TABLE
verklaringen. Daarom, als we vervelende fouten willen vermijden die het gevolg zijn van het proberen een niet-bestaande tabel te laten vallen, moeten we wat extra werk doen.
Optie 1:Controleer of de tabel bestaat
We kunnen de DBA_TABLES
. controleren datadictionary-weergave om te zien of de tabel bestaat. Deze weergave beschrijft alle relationele tabellen in de database. De kolommen zijn dezelfde als die in ALL_TABLES
.
We kunnen deze tabel controleren om te zien of de tabel bestaat, en dan alleen de DROP TABLE
. uitvoeren verklaring als dat zo is.
Voorbeeld:
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;
Resultaat:
PL/SQL procedure successfully completed.
In dit geval is de tabel met de naam t1
bestond al en is verwijderd.
Als we nu dezelfde code opnieuw uitvoeren, krijgen we dezelfde uitvoer:
PL/SQL procedure successfully completed.
Er is geen fout opgetreden, ook al bestaat de tabel niet meer.
Als we echter gewoon proberen de tabel te laten vallen zonder eerst te controleren of deze bestaat, krijgen we een foutmelding:
DROP TABLE T1;
Resultaat:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Optie 2:Test op de fout
Een andere manier om dit te doen, is door gewoon door te gaan en de DROP TABLE
. uit te voeren instructie, en vang vervolgens een ORA-00942-fout die optreedt. In het bijzonder vangen we elke SQLCODE -942-fout op die optreedt.
Voorbeeld:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Resultaat:
PL/SQL procedure successfully completed.
Ik heb dat uitgevoerd, hoewel de T1
tafel bestond niet. De ORA-00942-fout is opgevangen en afgehandeld, dus we hebben geen foutmelding gekregen.
Als de tafel al had bestaan, zou de tafel zijn verwijderd en zouden we dezelfde uitvoer zien.