Oracle Database inkluderar inte koden IF NOT EXISTS
sats med dess CREATE TABLE
uttalande, som vissa andra DBMS:er gör.
Därför, om vi inte vill skapa ett fel på grund av att tabellnamnet redan används, måste vi använda andra metoder för att kontrollera om tabellen finns.
Alternativ 1:Kontrollera DBA_TABLES
Visa
DBA_TABLES
är en dataordboksvy som 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 redan finns och sedan köra CREATE TABLE
uttalande om det inte redan finns.
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:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Resultat:
PL/SQL procedure successfully completed.
I det här fallet skapades tabellen eftersom ingen befintlig tabell hade namnet t1
.
Nu, om vi försöker skapa tabellen igen, kommer vi att få samma utdata som PL/SQL-proceduren slutförde, och det kommer inte att uppstå något fel.
Men om vi bara försöker skapa tabellen utan att först kontrollera dess existens får vi ett felmeddelande:
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"
Alternativ 2:Testa för felet
Ett annat sätt att göra det är att helt enkelt gå vidare och köra CREATE TABLE
och fånga sedan upp eventuella ORA-00955-fel som uppstår. Specifikt fångar vi alla SQLCODE -955-fel som uppstår.
Exempel:
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.
Jag körde det trots att T1
Tabellen fanns redan. ORA-00955-felet fångades och hanterades så vi fick inget felmeddelande och tabellen skapades inte.
Om tabellen inte redan hade funnits skulle tabellen ha skapats och vi skulle se samma utdata.