Ответ 1
Для этого можно использовать короткий анонимный блок.
BEGIN
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%' )
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
Я знаю, что этот вопрос может задавать много раз, но я не мог найти один оператор SQL. Я помню, что делал это раньше, но теперь я не мог вспомнить, как я это делал.
Я хочу удалить все таблицы, имя которых начинается с "EXT_". Возможно ли это сделать с одной строкой оператора SQL.
Для этого можно использовать короткий анонимный блок.
BEGIN
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%' )
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
Это невозможно только с одним утверждением. Обычно я пишу sql для получения всех таблиц, а затем выполняю результаты:
select 'drop table ' || table_name || ';'
from user_tables
where table_name like 'EXT_%';
Этот код будет DROP не только EXT_% таблиц, но и будет действовать как DROP EXT%. Подчеркивание - это особый символ, который действует как "%", но для одного символа.
BEGIN
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%' )
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
Чтобы достичь желаемых результатов, вы должны изменить свой код ниже
BEGIN
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT\_%' ESCAPE '\')
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
Он ускользает от подчеркивания char для того, чтобы его транслировать буквально, модификатор ESCAPE '\' указывает, что escape char равен '\'
В большинстве случаев вы обнаружите нарушения правил. В этом случае этот script может помочь вам:
DECLARE
c_action CONSTANT VARCHAR2(10) := 'DROP';
BEGIN
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%' )
LOOP
FOR reg IN (SELECT uc.table_name,
uc.constraint_name
FROM user_constraints uc
WHERE uc.table_name IN (c.table_name)) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || c_action ||
' CONSTRAINT ' || reg.constraint_name ;
END LOOP;
END LOOP;
COMMIT;
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%' )
LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || c.table_name;
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;