2009-03-12 15 views
14

Ich schreibe ein Schema Upgrade-Skript für ein Produkt, das von einer Oracle-Datenbank abhängt. In einem Bereich muss ich einen Index für eine Tabelle erstellen - falls dieser Index noch nicht existiert. Gibt es eine einfache Möglichkeit, nach einem Index zu suchen, von dem ich den Namen eines Oracle-Skripts kenne?So überprüfen Sie einen Index in Oracle

Es wäre in SQL Server ähnlich der folgenden sein: IF NOT EXISTS (SELECT * FROM SYSINDEXES WHERE NAME = 'MyIndex') // Dann ist mein MyIndex

Antwort

30

select count erstellen (*) von USER_INDEXES wo index_name = 'myIndex'

sqlplus unterstützt IF ... nicht, obwohl Sie anonyme PL/SQL-Blöcke verwenden müssen, was EXECUTE IMMEDIATE für DDL bedeutet.

DECLARE 
    i INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 'MYINDEX'; 
    IF i = 0 THEN 
     EXECUTE IMMEDIATE 'CREATE INDEX myIndex ...'; 
    END IF; 
END; 
/

Bearbeiten: Wie bereits erwähnt, speichert Oracle nicht angebene Objektnamen in Großbuchstaben.

+1

Wenn Sie sie nicht angeben, werden Datenbankobjekte (einschließlich Indizes) in Großbuchstaben gespeichert. Wenn Sie also einen CREATE INDEX myIndex erstellen, wird dieser in USER_INDEXES als MYINDEX gespeichert. Und Oracle (standardmäßig) wird keine Groß- und Kleinschreibung beachten. –

+1

nur zusätzlich zu dieser Antwort: Wenn Sie überprüfen müssen, ob ein Index in einem anderen Schema vorhanden ist, abfragen ALL_INDEXES anstelle von USER_INDEXES. Wenn USER_INDEXES nicht mit einem "ALTER SESSION SET CURRENT_SCHEMA = XYZ" überprüft wird, werden Sie weiterhin die Indizes für den aktuell angemeldeten Benutzer abfragen. – SaschaM78