Как удалить список таблиц из схемы в Oracle?

58
7

Моя схема Oracle scott содержит список таблиц, подобный этому

'prefix_A'
'prefix_B'
'prefix_C'
'A'
'B'
'C'

Теперь я хочу отбросить список таблиц, содержащих префикс таблицы, такой как "Префикс _", но другие таблицы A, B, C останутся такими же.

Как это возможно?

Заранее спасибо.

спросил(а) 2011-09-27T14:34:00+04:00 9 лет, 1 месяц назад
1
Решение
114

Используйте динамический SQL, отключающий словарь данных.

begin
for trec in ( select table_name
from user_tables
where table_name like 'PREFIX\_%' escape '\' )
loop
dbms_output.put_line('dropping table ' || trec.table_name);
execute immediate 'drop table '||trec.table_name;
end loop;
end;

Это хорошая идея, чтобы быть точным с предложением LIKE; используя ключевое слово escape чтобы убедиться, что символы подчеркивания не рассматриваются как подстановочные знаки. В качестве альтернативы используйте substr(table_name, 1, 7) = 'PREFIX_'.

Отбрасывание неправильной таблицы не является катастрофой, если вы работаете с 10g или более поздней версией, и включена опция RECYCLE BIN, но все равно лучше не делать этого. Очевидно, вы бы не запускали код, подобный этому в Production, но вы бы использовали этот принцип для создания сценария операторов drop.

Вышеприведенный код не обрабатывает зависимости. Если у вас есть внешние ключи, ссылающиеся на префиксные таблицы, и вы хотите принудительно отбрасывать таблицы, используйте эту дополнительную логику:

     execute immediate 'drop table '|| trec.table_name ||' cascade constraint';

Это снижает ограничения внешнего ключа, но оставляет (ранее) зависимые таблицы.

ответил(а) 2011-09-27T14:41:00+04:00 9 лет, 1 месяц назад
41

Я использовал это, чтобы отключить ограничения, уменьшить ограничения и удалить таблицы.

 -- disable constraints on tables
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 t.table_name like 'WF_%'
AND c.status = 'ENABLED'
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;

-- drop the constraints
begin
for r in ( select table_name, constraint_name
from user_constraints where
table_name like 'WF_%' )
loop
execute immediate 'alter table '||r.table_name
||' drop constraint '||r.constraint_name;
end loop;
end loop;

-- drop the tables
begin
for trec in ( select table_name
from user_tables
where table_name like 'WF_%' )
loop
execute immediate 'drop table '||trec.table_name|| ' purge';
end loop;
end;

ответил(а) 2014-05-12T16:39:00+04:00 6 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема