DROP все таблицы, начинающиеся с "EXT_" в Oracle SQL

Я знаю, что этот вопрос может задавать много раз, но я не мог найти один оператор SQL. Я помню, что делал это раньше, но теперь я не мог вспомнить, как я это делал.

Я хочу удалить все таблицы, имя которых начинается с "EXT_". Возможно ли это сделать с одной строкой оператора SQL.

Ответ 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;

Ответ 2

Это невозможно только с одним утверждением. Обычно я пишу sql для получения всех таблиц, а затем выполняю результаты:

select 'drop table ' || table_name || ';'
from   user_tables
where  table_name like 'EXT_%';

Ответ 3

Этот код будет 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 равен '\'

Ответ 4

В большинстве случаев вы обнаружите нарушения правил. В этом случае этот 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;