SELECT DISTINCT(UI.TABLE_NAME)
,UI_INDEX_NAME
FROM USER_INDEXES UI
INNER JOIN USER_TABLES UT ON UT_TABLE_NAME = UI.TABLE_NAME
INNER JOIN TMP ON TMP.TABLE_NAME = UI.TABLE_NAME
INNER JOIN USER_CONS_COLUMNS UC ON UC.TABLE_NAME = UI.TABLE_NAME
WHERE UT.IOT_TYPE IS NULL
AND UC.COLUMN_NAME IN (
'STAFF_ID'
,'STAFF_UNIQUE_ID'
)
AND UC.TABLE_NAME LIKE 'HR_%'
OR UC.TABLE_NAME = 'PAYROLL';
Над таблицей запросить список индексов, ссылающихся на таблицу, имеющую PK как staff_id
или staff_unique_id
из имени таблицы PAYROLL
и HR_*
.TMP
- это таблица, в которой хранится список имен таблиц, так как я не хочу, чтобы он просматривал все USER_TABLE
или USER_INDEX
.
У меня нет проблем при ручном выборе, однако обнаружена ошибка:
ORA-02270: нет соответствующего уникального или первичного ключа для этого списка столбцов
в PL / SQL при выборе результата и выполнении INDEX REBULD
Результат возврата кажется неверным, многие избыточные INDEX_NAME
указывают на одну и ту же таблицу.Я положил DISTINCT
для UI.TABLE_NAME
, чтобы решить дубликат.Но в PLSQL мне не нужно заполнять UI.TABLE_NAME
, так как может появиться ошибка?
--index rebuild
FOR r IN (....) LOOP
l_sql := 'ALTER INDEX '||r.index_name||' REBUILD';
EXECUTE IMMEDIATE l_sql;
END LOOP;
--disable constraint
FOR m IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
INNER JOIN TMP ON UC.TABLE_NAME = TMP.TABLE_NAME
WHERE UC.TABLE_NAME = TMP.TABLE_NAME AND UC.CONSTRAINT_TYPE IN
('R', 'C', 'U') AND UC.TABLE_NAME LIKE 'HR_%' OR UC.TABLE_NAME =
'PAYROLL') LOOP
l_sql := 'ALTER TABLE '||m.TABLE_NAME||' DISABLE CONSTRAINT
'||m.CONSTRAINT_NAME||' CASCADE';
EXECUTE IMMEDIATE l_sql;
END LOOP;
--enable constraint
FOR n IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
INNER JOIN TMP ON UC.TABLE_NAME = TMP.TABLE_NAME
WHERE UC.TABLE_NAME = TMP.TABLE_NAME AND UC.CONSTRAINT_TYPE IN
('R', 'C', 'U') AND UC.TABLE_NAME LIKE 'HR_%' OR UC.TABLE_NAME =
'PAYROLL') LOOP
l_sql := 'ALTER TABLE '||n.TABLE_NAME||' ENABLE CONSTRAINT
'||n.CONSTRAINT_NAME||'';
EXECUTE IMMEDIATE l_sql;
END LOOP;