Я хотел переименовать индекс динамически.
Предыстория: Oracle автоматически создает индекс для материализованных представлений, если базовая таблица имеет первичный ключ (я думаю?). Имя этого индекса меняется каждый раз, когда MV удаляется и создается. Я хочу переименовать этот индекс.
Мой план состоял в том, чтобы выбрать имя индекса и вставить его в оператор alter.
Select table_owner||'.'||INDEX_Name
from all_indexes
WHERE table_name = 'mytable'
and table_owner = 'myuser'
and uniqueness = 'UNIQUE';
ALTER INDEX (that select statement here)
RENAME TO abetterindexname
Но это бросило эту ошибку:
ORA-00953: missing or invalid index name
Я разобрался с ответом перед публикацией. Вот что сработало:
DECLARE
avariable varchar2(100);
BEGIN
Select table_owner||'.'||INDEX_Name
into avariable
from all_indexes
WHERE table_name = 'mytable'
and table_owner = 'myuser'
and uniqueness = 'UNIQUE';
execute immediate 'ALTER INDEX '||avariable||' RENAME TO abetterindexname';
END;
Источник: https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:7038453003289. - Мне пришлось создать строку для оператора немедленного выполнения.
Если кто-нибудь знает, как это сделать только с SQL, мне было бы интересно.