Oracle Database bevat niet de IF NOT EXISTS
clausule met zijn CREATE TABLE
statement, zoals sommige andere DBMS'en doen.
Als we daarom geen fout willen produceren omdat de tabelnaam al in gebruik is, moeten we andere methoden gebruiken om te controleren op het bestaan van de tabel.
Optie 1:Controleer de DBA_TABLES
Bekijk
DBA_TABLES
is een datadictionary-weergave die alle relationele tabellen in de database beschrijft. De kolommen zijn dezelfde als die in ALL_TABLES
.
We kunnen deze tabel controleren om te zien of de tabel al bestaat, voer dan alleen de CREATE TABLE
uit statement als het nog niet bestaat.
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:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Resultaat:
PL/SQL procedure successfully completed.
In dit geval is de tabel gemaakt omdat er geen bestaande tabel de naam t1
had .
Als we nu proberen de tabel opnieuw te maken, krijgen we dezelfde uitvoer die de PL/SQL-procedure met succes heeft voltooid, en er zal geen fout optreden.
Als we echter gewoon proberen de tabel aan te maken zonder eerst te controleren of hij bestaat, krijgen we een foutmelding:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Resultaat:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
Optie 2:Test op de fout
Een andere manier om dit te doen is door gewoon door te gaan en de CREATE TABLE
. uit te voeren instructie, en vang vervolgens een ORA-00955-fout op die optreedt. In het bijzonder vangen we elke SQLCODE -955-fout op die optreedt.
Voorbeeld:
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;
Resultaat:
PL/SQL procedure successfully completed.
Ik heb dat uitgevoerd, hoewel de T1
tafel bestond al. De ORA-00955-fout is gedetecteerd en afgehandeld, dus we hebben geen foutmelding gekregen en de tabel is niet gemaakt.
Als de tabel nog niet had bestaan, zou de tabel zijn gemaakt en zouden we dezelfde uitvoer zien.