Oracle Database inkluderer ikke IF EXISTS
klausul, som nogle andre DBMS'er tilbyder i deres DROP TABLE
udsagn. Derfor, hvis vi vil undgå grimme fejl som følge af at forsøge at droppe en ikke-eksisterende tabel, er vi nødt til at gøre lidt ekstra arbejde.
Mulighed 1:Tjek, om tabellen eksisterer
Vi kan tjekke DBA_TABLES
dataordbogsvisning for at se, om tabellen eksisterer. Denne visning beskriver alle relationelle tabeller i databasen. Dens kolonner er de samme som dem i ALL_TABLES
.
Vi kan kontrollere denne tabel for at se, om tabellen eksisterer, og derefter kun køre DROP TABLE
erklæring, hvis det gør.
Eksempel:
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 dette tilfælde er tabellen kaldet t1
eksisterede allerede og blev droppet.
Nu, hvis vi kører den samme kode igen, får vi det samme output:
PL/SQL procedure successfully completed.
Der opstod ingen fejl, selvom tabellen ikke længere eksisterer.
Men hvis vi blot forsøger at droppe tabellen uden først at kontrollere dens eksistens, får vi en fejl:
DROP TABLE T1;
Resultat:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Mulighed 2:Test for fejlen
En anden måde at gøre det på er simpelthen at gå videre og køre DROP TABLE
sætning, og fange derefter enhver ORA-00942-fejl, der opstår. Specifikt fanger vi enhver SQLCODE -942 fejl, der opstår.
Eksempel:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Resultat:
PL/SQL procedure successfully completed.
Jeg kørte det, selvom T1
tabellen eksisterede ikke. ORA-00942-fejlen blev fanget og håndteret, så vi fik ikke en fejlmeddelelse.
Hvis tabellen allerede havde eksisteret, ville tabellen være blevet slettet, og vi ville se det samme output.