sql >> Base de Datos >  >> RDS >> Oracle

2 formas de crear una tabla si aún no existe en Oracle

Oracle Database no incluye el IF NOT EXISTS cláusula con su CREATE TABLE declaración, como lo hacen otros DBMS.

Por lo tanto, si no queremos que se produzca un error debido a que el nombre de la tabla ya se está utilizando, debemos utilizar otros métodos para comprobar la existencia de la tabla.

Opción 1:Comprobar DBA_TABLES Ver

DBA_TABLES es una vista de diccionario de datos que describe todas las tablas relacionales en la base de datos. Sus columnas son las mismas que las de ALL_TABLES .

Podemos verificar esta tabla para ver si la tabla ya existe, luego solo ejecute CREATE TABLE declaración si aún no existe.

Ejemplo:

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;

Resultado:

PL/SQL procedure successfully completed.

En este caso, la tabla se creó porque ninguna tabla existente tenía el nombre t1 .

Ahora, si tratamos de crear la tabla nuevamente, obtendremos el mismo resultado que el procedimiento PL/SQL completó con éxito y no habrá ningún error.

Sin embargo, si simplemente intentamos crear la tabla sin verificar primero su existencia, obtendremos un error:

CREATE TABLE T1 (
    c1 number(6,0),
    c2 varchar2(10)
);

Resultado:

Error report -
ORA-00955: name is already used by an existing object
00955. 00000 -  "name is already used by an existing object"

Opción 2:Prueba del error

Otra forma de hacerlo es simplemente seguir adelante y ejecutar CREATE TABLE declaración y, a continuación, detecte cualquier error ORA-00955 que se produzca. Específicamente, detectamos cualquier error SQLCODE -955 que ocurra.

Ejemplo:

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;

Resultado:

PL/SQL procedure successfully completed.

Ejecuté eso a pesar de que el T1 La mesa ya existía. El error ORA-00955 fue detectado y manejado, por lo que no recibimos un mensaje de error y la tabla no se creó.

Si la tabla no hubiera existido ya, se habría creado y veríamos el mismo resultado.