sql >> Database teknologi >  >> RDS >> Oracle

2 måder at oprette en tabel på, hvis den ikke allerede findes i Oracle

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.


  1. TSQL md5 hash forskellig fra C# .NET md5

  2. PostgreSQL fremmednøgle eksisterer ikke, udstedelse af arv?

  3. Sortering af træ med en materialiseret sti?

  4. SQL Server-ydelse TOP IO-forespørgsel -2