2010-08-26 9 views
6

Ich muss mit PL/SQL finden, wenn eine bestimmte Sequenz namens z. MY_SEQ wird beendet. Wenn die Sequenz existiert, löschen Sie sie und erstellen Sie eine neue oder erstellen Sie einfach eine neue Sequenz.Wie finden Sie, ob eine Sequenz existiert mit PL/SQL

E.G. (Pseudo-Code)

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

Beachten Sie, dass löschen und neu zu alle Objekte ungültig machen, die davon abhängen, und entfernen Sie alle noch ausstehenden Zuschüsse. Sie müssten diese auch zurückstellen. Es wäre schön, wenn Oracle 'ALTER SEQUENCE sequence_name RESET;' unterstützen würde. –

Antwort

8

können Sie das Wörterbuch Ansicht ALL_SEQUENCES überprüfen (oder USER_SEQUENCES wenn der ausführende Benutzer der Eigentümer ist), zum Beispiel:

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, ich arbeitete wie ein Charme. –

0

Ich habe einige Ideen für diese (alle ungetestet):

1) Oracle unterstützt normalerweise so etwas wie CREATE OR REPLACE

2) Verwenden Sie eine der Systemansichten aus dem SYS-Benutzer zu Überprüfen Sie mit einem SELECT, ob die Sequenz existiert.

3) Verwenden Sie execute_immedite mit einem BEGIN .. EXCEPTION ... END Block, um das Objekt zu löschen. Wenn es nicht existiert, sollte ein Fehler auftreten, den Sie ignorieren können.

+0

# 1 funktioniert nicht für Sequenzen. # 3 ist korrekt und die effizienteste Methode. –

Verwandte Themen