2009-03-12 5 views
14

Я пишу сценарий обновления схемы для продукта, который зависит от базы данных Oracle. В одной области мне нужно создать индекс в таблице - если этот индекс еще не существует. Есть ли простой способ проверить наличие индекса, который я знаю, имя в сценарии Oracle?Как проверить индекс в Oracle

Это было бы похоже на это в SQL Server: IF NOT EXISTS (SELECT * FROM SYSINDEXES WHERE NAME = 'myIndex') // Затем создать мой myIndex

ответ

30

SELECT COUNT (*) из USER_INDEXES где index_name = 'myIndex'

sqlplus не поддерживает IF ..., поэтому вам придется использовать анонимные блоки PL/SQL, что означает EXECUTE IMMEDIATE для DDL.

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; 
/

Редактировать: как указано, Oracle хранит имена без кавычек во всех прописных.

+1

Если вы не цитируете их, объекты базы данных (включая индексы) сохраняются в верхнем регистре. Поэтому, если вы делаете CREATE INDEX myIndex, то в USER_INDEXES он будет храниться как MYINDEX. И Oracle (по умолчанию) не будет делать регистрозависимые совпадения. –

+1

просто в дополнение к этому ответу: если вам нужно проверить, существует ли индекс в другой схеме, запросите ALL_INDEXES вместо использования USER_INDEXES. Проверка USER_INDEXES не работает с «ALTER SESSION SET CURRENT_SCHEMA = XYZ», вы все равно будете запрашивать индексы для текущего пользователя. – SaschaM78