Как проверить индекс и удалить + создать, если существует в Oracle - PullRequest
0 голосов
/ 23 сентября 2019

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

DECLARE
   i INTEGER;
BEGIN
  SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 
'ELEMENTS_5_NDX';
IF i = 0 THEN
    EXECUTE IMMEDIATE ('
    CREATE INDEX ELEMENTS_5_NDX
    ON elements_l
    (scode ASC, pkey ASC, START_DATE ASC, OPP_SEX_IND ASC)
    ');
ELSE
    EXECUTE IMMEDIATE ('DROP INDEX ELEMENTS_5_NDX');
    COMMIT;
    EXECUTE IMMEDIATE ('
    CREATE INDEX ELEMENTS_5_NDX
    ON elements_l
    (scode ASC, pkey ASC, START_DATE ASC, OPP_SEX_IND ASC)
    ');    
 END IF;
 END;
 /

Я получаю следующую ошибку - Отчет об ошибке: ORA-00955: имя уже используется существующим объектом ORA-06512: в строке 9 00955. 00000 - "имя уже используется существующим объектом "

Пожалуйста, предложите несколько советов.

1 Ответ

0 голосов
/ 23 сентября 2019

Это сработало -

 DECLARE
  i INTEGER;
 BEGIN
   SELECT COUNT(*) INTO i FROM all_objects WHERE index_name = 
   'ELEMENTS_5_NDX' and owner = sys_context( 'userenv', 'current_schema' );
   IF i > 0 THEN
    EXECUTE IMMEDIATE ('DROP INDEX ELEMENTS_5_NDX');
   END IF;
  EXECUTE IMMEDIATE ('CREATE INDEX ELEMENTS_5_NDX ON elements_l
   (scode ASC, pkey ASC, START_DATE ASC, OPP_SEX_IND ASC)');    
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...