sistema - oracle software
¿Cómo uso CREAR O REEMPLAZAR? (13)
''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 con lo que jeffrey-kemp mencionó: este script debajo NO guardará 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;
¿Estoy en lo cierto al entender que CREAR O REEMPLAZAR significa básicamente "si el objeto existe, soltarlo, y luego crearlo 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álido):
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.
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 también ayude a la referencia: Error PLS-00103 en PL / SQL Developer
Esto funciona en funciones, procedimientos, paquetes, tipos, sinónimos, activador y vistas.
Actualizar:
Después de actualizar la publicación por tercera vez, reformularé esto:
Esto no funciona en las tablas :)
Y sí, hay documentation sobre esta sintaxis, y no hay opción REPLACE
para CREATE TABLE
.
La siguiente secuencia de comandos 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;
No funciona con tablas, solo funciones, etc.
Aquí hay un sitio con algunos examples .
No hay una tabla de creación o reemplazo en Oracle.
Debes:
DROP TABLE foo; CREATE TABLE foo (....);
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.
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 (...
Si lo está haciendo en 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 el registro, truncar la tabla; de lo contrario, crear tabla
Trabaja como Crear o Reemplazar.
Un procedimiento útil para las bases de datos de Oracle sin utilizar excepciones (bajo circunstancias, debe reemplazar user_tables con dba_tables y / o restringir el tablespace 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;
Una de las cosas buenas de la sintaxis es que puedes estar seguro de que CREATE OR REPLACE
nunca hará que pierdas datos (lo máximo que perderás es el código, que con suerte habrás almacenado en algún lugar del control de código fuente).
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 una DROP + CREAR en un script, y no le importan los errores espurios de "el objeto no existe" (cuando el DROP no encuentra la tabla), puede hacer esta:
BEGIN
EXECUTE IMMEDIATE ''DROP TABLE owner.mytable'';
EXCEPTION
WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
CREATE OR REPLACE
solo se puede usar en funciones, procedimientos, tipos, vistas o paquetes; no funcionará en las tablas.
-- 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;
/