Oracle Database inkluderer ikke IF NOT EXISTS
klausul med dens CREATE TABLE
sætning, ligesom nogle andre DBMS'er gør.
Derfor, hvis vi ikke ønsker at producere en fejl på grund af, at tabelnavnet allerede bruges, skal vi bruge andre metoder til at kontrollere, om tabellen findes.
Mulighed 1:Tjek DBA_TABLES
Vis
DBA_TABLES
er en dataordbogsvisning, der 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 allerede eksisterer, og derefter kun køre CREATE TABLE
erklæring, hvis den ikke allerede eksisterer.
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:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Resultat:
PL/SQL procedure successfully completed.
I dette tilfælde blev tabellen oprettet, fordi ingen eksisterende tabel havde navnet t1
.
Nu, hvis vi prøver at oprette tabellen igen, får vi det samme output, som PL/SQL-proceduren gennemførte med succes, og der vil ikke være nogen fejl.
Men hvis vi blot prøver at oprette tabellen uden først at kontrollere dens eksistens, får vi en fejl:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Resultat:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
Mulighed 2:Test for fejlen
En anden måde at gøre det på er simpelthen at gå videre og køre CREATE TABLE
sætning, og fange derefter enhver ORA-00955-fejl, der opstår. Specifikt fanger vi enhver SQLCODE -955 fejl, der opstår.
Eksempel:
DECLARE
sql_stmt long;
BEGIN
sql_stmt:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL;
ELSE
RAISE;
END IF;
END;
Resultat:
PL/SQL procedure successfully completed.
Jeg kørte det, selvom T1
tabel eksisterede allerede. ORA-00955-fejlen blev fanget og håndteret, så vi fik ikke en fejlmeddelelse, og tabellen blev ikke oprettet.
Hvis tabellen ikke allerede havde eksisteret, ville tabellen være blevet oprettet, og vi ville se det samme output.