¿Cómo utilizo CREAR O REEMPLAZAR?

98

¿Estoy en lo correcto al entender que CREAR O REEMPLAZAR básicamente significa "si el objeto existe, suéltelo y luego créelo de cualquier manera"?

Si es así, ¿qué estoy haciendo mal? Esto funciona:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

Y esto no (ORA-00922: opción faltante o inválida):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

¿Estoy haciendo algo estúpido? Parece que no puedo encontrar mucha documentación sobre esta sintaxis.

Jason Baker
fuente

Respuestas:

154

Esto funciona en funciones, procedimientos, paquetes, tipos, sinónimos, disparadores y vistas.

Actualizar:

Después de actualizar la publicación por tercera vez, reformularé esto:

Esto no funciona en tablas :)

Y sí, hay documentación sobre esta sintaxis y no hay REPLACEopción para CREATE TABLE.

Quassnoi
fuente
33

Una de las cosas buenas de la sintaxis es que puede estar seguro de que CREATE OR REPLACEnunca perderá datos (lo máximo que perderá es el código, que con suerte habrá almacenado en el control de fuente en algún lugar).

La sintaxis equivalente para las tablas es ALTER, lo que significa que debe enumerar explícitamente los cambios exactos que se requieren.

EDITAR: Por cierto, si necesita hacer DROP + CREATE en un script, y no le importan los errores falsos "el objeto no existe" (cuando DROP no encuentra la tabla), puede hacerlo esta:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
Jeffrey Kemp
fuente
23

No hay ninguna tabla de creación o reemplazo en Oracle.

Debes:

DROP TABLE foo;
CREAR TABLA foo (....);
RC.
fuente
10

CREATE OR REPLACE solo se puede usar en funciones, procedimientos, tipos, vistas o paquetes; no funcionará en tablas.

Andy Mikula
fuente
1
CREATE OR REPLACEtambién funciona para sinónimos y desencadenantes
Richard Mitchell
4

El siguiente script debería hacer el truco en Oracle:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;
Kavan
fuente
3

No funciona con tablas, solo funciones, etc.

Aquí hay un sitio con algunos ejemplos .

Polo Norte
fuente
3

Un procedimiento útil para bases de datos de Oracle sin usar excepciones (bajo circunstancias, debe reemplazar user_tables con dba_tables y / o restringir el espacio de tabla en la consulta):

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;
XorNegativo
fuente
3
-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/
grokster
fuente
Un poco más de código que otros ejemplos, pero también un poco más claro en su propósito
grokster
1

Si lo está haciendo en el código, primero verifique la tabla en la base de datos utilizando la consulta SELECT table_name FROM user_tables WHERE table_name = 'XYZ'

si se encuentra un registro, truncar la tabla de lo contrario crear una tabla

Trabaja como Crear o Reemplazar.

Pradip Gavali
fuente
1

Puede utilizar CORT ( www.softcraftltd.co.uk/cort ). Esta herramienta permite CREAR O REEMPLAZAR tablas en Oracle. Parece que:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

Conserva los datos.

Oxidado
fuente
1

Así que he estado usando esto y ha funcionado muy bien: - funciona más como un DROP IF EXISTS pero hace el trabajo

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

Espero que esto ayude También referencia: PLS-00103 Error en PL / SQL Developer

BGDev
fuente
1

"Crear o reemplazar tabla" no es posible. Como dijeron otros, puede escribir un procedimiento y / o usar comenzar a ejecutar inmediatamente (...). Debido a que no veo una respuesta sobre cómo (re) crear la tabla, puse un script como respuesta.

PD: en línea con lo que mencionó jeffrey-kemp: este script debajo NO guardará datos que ya están presentes en la tabla que va a colocar. Debido al riesgo de perder datos, en nuestra empresa solo se permite alterar las tablas existentes en el entorno de producción y no se permite eliminar tablas. Al utilizar la declaración de la tabla de caída, tarde o temprano, la policía de la empresa estará parada en su escritorio.

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;
cybork
fuente
¿Necesita ser coherente con A_TABLE_EXAMPLE y A_TABLE_X?
Jonathan Leffler
0

Yo haría algo como esto

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';
ljupcecar
fuente
-4

Si es para MS SQL ... El siguiente código siempre se ejecutará sin importar si la tabla ya existe o no.

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...
JuniorFlip
fuente
1
Lo siento, pero este es Oracle. :-)
Jason Baker
¿Es correcto el comentario "// hay datos en la tabla"?
Jeffrey Kemp
lo siento un poco mejor, el object_id comprueba si la tabla existe en la base de datos. debería decir // ya se ha creado la tabla en la base de datos
JuniorFlip