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;