2009-06-17 15 views
76

¿Tengo razón en entender que CREAR O REEMPLAZAR significa básicamente "si el objeto existe, soltarlo, y luego crearlo de cualquier manera?"¿Cómo uso CREAR O REEMPLAZAR?

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: falta o está opción no vá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.

Respuesta

120

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

Actualización:

Después de actualizar el cargo por tercera vez, voy a reformular esto:

Esto no funciona en las tablas :)

Y sí, hay documentation en esta sintaxis, y no hay opción REPLACE para CREATE TABLE.

+1

Suspiro, juro que leí que lo hizo en alguna parte. Oh bien. :) –

+5

Tampoco funciona para vistas materializadas – skaffman

+3

Tampoco funciona para enlaces de bases de datos. –

19

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

Usted debe:

 
DROP TABLE foo; 
CREATE TABLE foo (....); 
3

no funciona con las tablas, sólo las funciones etc.

Aquí es un sitio con un poco de examples.

7

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

+1

'CREAR O REEMPLAZAR' también funciona para sinónimos y activadores –

-3

Si esto 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 (... 
+0

Lo sentimos, pero este es Oracle. :-) –

+0

es el comentario "// ¿hay datos en la tabla" exacto? –

+0

lo siento un poco mejor, el object_id comprueba si la tabla existe en el archivo db. debería decir // ha sido creada la tabla ya en el db – JuniorFlip

31

Una de las cosas buenas acerca de la sintaxis es que se puede estar seguro de que un CREATE OR REPLACE nunca provocar la pérdida de datos (el máximo que deberá perder es código, que esperamos que pueda haber almacenada en control de código fuente algun lado).

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

EDIT: Por cierto, si usted necesita hacer una gota + CREAR en un guión, y no se preocupan por la espuria "objeto no existe" errores (cuando la caída no encuentra la tabla), se puede hacer esto:

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

siguiente script debe hacer el truco en Oracle:

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

Si usted está haciendo en el código a continuación, compruebe en primer lugar para la tabla de la base de datos mediante el uso de consulta nombre_tabla SELECT DE user_tables DONDE nombre_tabla = 'XYZ'

si el registro se encontró luego truncar la tabla de lo contrario crear la tabla

trabajo como crear o sustituir.

1

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

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

Conserva datos.

+0

El sitio web parece haber sido hi-jacked ... –

+0

Ah. mierda ... Gracias por dejarme saber ... – Rusty

2

Un procedimiento útil para bases de datos Oracle sin utilizar Excepciones (en circunstancias que tiene que reemplazar user_tables con dba_tables y/o limitar el espacio de tablas 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; 
2
-- 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; 
/
+0

Un poco más de código que otros ejemplos pero también un poco más claro en su propósito – grokster

0

Así que he estado usando esto y que ha funcionado muy bien: - funciona más como una gota SI existe, 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; 
/ 

esperanza esto ayuda también referencia: PLS-00103 Error in PL/SQL Developer

0

'Crear o reemplazar tabla' no es posible. Como otros indicaron, 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 una secuencia de comandos como respuesta.

PD: en línea de lo que jeffrey-kemp mencionó: esta secuencia de comandos debajo NO guardará los datos que ya están presentes en la tabla que va a colocar. Debido al riesgo de pérdida de datos, en nuestra empresa solo está permitido alterar las tablas existentes en el entorno de producción, y no está permitido eliminar tablas. Al usar la declaración de la tabla desplegable, tarde o temprano obtendrá a la policía de la compañía 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; 
+0

¿Necesita ser consistente con A_TABLE_EXAMPLE y A_TABLE_X? –

+0

sí de hecho jonathan-leffler. Lo cambie. – cybork

Cuestiones relacionadas