sql >> Database >  >> RDS >> Oracle

2 manieren om een ​​tabel te maken als deze nog niet bestaat in Oracle

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.


  1. Stop met SQL Server je vuile werk te laten doen

  2. Hoe krijg ik ForeignCollection Field in Cursor in Ormlite

  3. Rethink Flask - Een eenvoudige takenlijst mogelijk gemaakt door Flask en RethinkDB

  4. Een CHECK-beperking toevoegen aan een bestaande tabel in SQL Server (T-SQL)