statement ejemplo developer current create consultar cache sql oracle sequence

ejemplo - ¿Hay algo como "si no existe crear secuencia..." en Oracle SQL?



insert sequence oracle (5)

Me gusta:

DECLARE C NUMBER; BEGIN SELECT COUNT(*) INTO C FROM ALL_TRIGGERS WHERE OWNER = ''YOUROWNER'' AND TRIGGER_NAME = ''YOURTRIGGER''; IF (C = 0) THEN EXECUTE IMMEDIATE '' CREATE TRIGGER "YOUROWNER"."YOURTRIGGER" blah blah blah your trigger blah blah ''; END IF; END; /

Para mi aplicación que utiliza una base de datos Oracle 8, proporciono un script SQL para configurar elementos como activadores, secuencias, etc., que se pueden copiar y pegar en SQL * Plus. Me gustaría que la secuencia de comandos no se detenga con un error si ya existe una secuencia que estoy intentando crear. Para un activador, esto se puede hacer fácilmente usando "crear o reemplazar un activador ...", pero para una secuencia esto no funciona. También intenté "" si no existe mi secuencia y luego crear una secuencia ... "pero no fue así. ¿Hay alguna alternativa?

Alternativamente, si esto no es posible, ¿hay una manera de hacer una "eliminación de secuencia de secuencias" sin que SQL * Plus aborte el script si mi secuencia no existe?


Puede consultar la tabla de secuencia de user_sequence para ver si la secuencia que se está creando ya existe o no.

Similar a la solución de davek : la idea es, antes de crear cualquier secuencia, abandonar la secuencia y crearla, todo en SQL dinámico, crear una función y decir cuándo necesita crear la secuencia 10, deje que la función se ocupe ...

function crt_seq(p_seq_name varchar2) return boolean begin for i in (select 1 from user_sequence where sequence_name = upper(p_seq_name)) loop ---- Already exists. You can drop and recreate or return false to error out execute immediate ''drop sequence ''||p_seq_name; execute immediate ''create sequence ''||p_seq_name||'' start with 1 increment by 1 nocache''; end loop; return true; exception when others then return false; end;

Puede parametrizar todas las demás opciones y tener una función elaborada para crear una secuencia para usted.


Si está seguro de que el script siempre se ejecutará bajo SQL * Plus, puede poner entre corchetes las sentencias CREATE SEQUENCE con una directiva para continuar con el error:

WHENEVER SQLERROR CONTINUE -- create sequences here, ignoring errors WHENEVER SQLERROR EXIT SQL.SQLCODE

Tenga en cuenta si hay otros errores (problemas de permisos, fallas de sintaxis, etc.) en las secuencias de creación de secuencias que se ignorarán.


DECLARE lsSeqName VARCHAR2(32 CHAR) := UPPER(''MY_SEQUENCE_NAME''); lnSeqCount NUMBER; BEGIN -- try to find sequence in data dictionary SELECT count(1) INTO lnSeqCount FROM user_sequences WHERE UPPER(sequence_name) = lsSeqName; -- if sequence not found, create it IF lnSeqCount = 0 THEN EXECUTE IMMEDIATE ''CREATE SEQUENCE '' || lsSeqName || '' START WITH 1 MINVALUE 1 MAXVALUE 1000000000000000 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER''; END IF; END; /

O

-- helper method PROCEDURE createSeqIfNotExists ( isSeqName VARCHAR2 ) IS lnSeqCount NUMBER; BEGIN -- try to find sequence in data dictionary SELECT count(1) INTO lnSeqCount FROM user_sequences WHERE UPPER(sequence_name) = UPPER(isSeqName); -- if sequence not found, create it IF lnSeqCount = 0 THEN EXECUTE IMMEDIATE ''CREATE SEQUENCE '' || UPPER(isSeqName) || '' START WITH 1 MINVALUE 1 MAXVALUE 1000000000000000 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER''; END IF; END createSeqIfNotExists; -- call method BEGIN createSeqIfNotExists(''MY_SEQUENCE_NAME''); END; /


DECLARE v_dummy NUMBER; BEGIN -- try to find sequence in data dictionary SELECT 1 INTO v_dummy FROM user_sequences WHERE sequence_name = ''MY_SEQUENCE_NAME''; -- if sequence found, do nothing EXCEPTION WHEN no_data_found THEN -- sequence not found, create it EXECUTE IMMEDIATE ''create sequence my_sequence_name''; END;