По-добре е да избягвате записването на временни буферни файлове. Използвайте PL/SQL блок. Можете да стартирате това от SQL*Plus или да поставите това нещо в пакет или процедура. Присъединяването към USER_TABLES е налице, за да се избегнат ограниченията за изглед.
Малко вероятно е наистина да искате да деактивирате всички ограничения (включително NOT NULL, първични ключове и т.н.). Трябва да помислите за поставянето на constraint_type в клаузата 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;
/