sql >> Databasteknik >  >> RDS >> Oracle

2 sätt att skapa en tabell om den inte redan finns i Oracle

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.


  1. Hur kan jag ta bort en icke-null-begränsning i Oracle när jag inte vet namnet på begränsningen?

  2. SQL Server JSON_Modify, hur uppdaterar jag alla?

  3. Hur får jag lokal data till en skrivskyddad databas med dplyr?

  4. syntaxfel när variabler deklareras i en pl/sql-procedur