2010-08-26 45 views
6

Necesito encontrar usando PL/SQL si una secuencia específica llamada p. Ej. MY_SEQ sale. Si la secuencia existe, suéltala y crea una nueva, o simplemente crea una nueva secuencia.Cómo encontrar si existe una secuencia usando PL/SQL

POR EJEMPLO (Pseudocódigo)

IF EXISTS(MY_SEQ) THEN 
BEGIN 
    DROP SEQUENCE MY_SEQ; 
    CREATE SEQUENCE MY_SEQ... 
END; 
ELSE 
BEGIN 
    CREATE SEQUENCE MY_SEQ; 
END; 
+0

Tenga en cuenta que caer y volver a crearlo invalidará todos los objetos que dependen de ella y eliminar cualquier pendiente subsidios. Tendría que devolverlos también. Sería encantador si Oracle soportara 'ALTER SEQUENCE sequence_name RESET;'. –

Respuesta

8

se puede consultar la vista en el diccionario ALL_SEQUENCES (o USER_SEQUENCES si el usuario que está ejecutando es el propietario), por ejemplo:

BEGIN 
    FOR cc IN (SELECT sequence_name as sequence_exists 
       FROM all_sequences 
       WHERE sequence_owner = :seq_owner 
       AND sequence_name = :seq_name) LOOP 
     -- sequence exists, drop it (at most there will be *one* sequence) 
     EXECUTE IMMEDIATE 'DROP SEQUENCE XXX'; 
    END LOOP; 
    -- create sequence 
    EXECUTE IMMEDIATE 'CREATE SEQUENCE XXX'; 
END; 
+0

Tnx, trabajé como un encanto. –

0

Tengo varias ideas para este (todo no probado):

1) Oracle soporta normalmente algo así como CREATE OR REPLACE

2) Use una de las vistas del sistema por parte del usuario SYS para verifique con un SELECCIONAR si la secuencia existe.

3) Use execute_immediate con un bloque BEGIN .. EXCEPTION ... END para soltar el objeto. Si no existe, debe producirse un error que puede ignorar.

+0

# 1 no funciona para las secuencias. # 3 es correcto y el método más eficiente. –

Cuestiones relacionadas