Лучше избегать записи временных файлов спула. Используйте блок PL / SQL. Вы можете запустить это из SQL * Plus или поместить это в пакет или процедуру. Соединение с USER_TABLES позволяет избежать ограничений просмотра.
Маловероятно, что вы действительно хотите отключить все ограничения (включая NOT NULL, первичные ключи и т. Д.). Вам следует подумать о том, чтобы добавить тип_ограничения в предложении WHERE.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'ENABLED'
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
ORDER BY c.constraint_type DESC)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
END LOOP;
END;
/
Повторное включение ограничений немного сложнее - вам нужно включить ограничения первичного ключа, прежде чем вы сможете ссылаться на них в ограничении внешнего ключа. Это может быть сделано с помощью ORDER BY для constraint_type. «P» = первичный ключ, «R» = внешний ключ.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'DISABLED'
ORDER BY c.constraint_type)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
END LOOP;
END;
/