Oracle как удалить все таблицы из

Обновлено: 07.07.2024

После Google не могу найти простой способ вернуть свободное место после удаления таблицы.

Я нашел много объяснений, рассказывающих, как файл данных становится фрагментированным, большой стек скучных запросов, которые вам нужно выполнить, чтобы переместить «пустое пространство» в конец файла данных (таблица за таблицей . даже когда вы есть 200 столов!?).

Затем вам нужно уменьшить размер файла данных, «угадав», насколько вы можете его уменьшить, или вы должны точно знать, каков ваш «размер блока» . И, наконец, вы не должны забывать «перестраивать индексы».

Существует ли простая процедура PL / SQL, которая, учитывая имя табличного пространства или имя файла данных, будет выполнять эту работу? Или любой подобный инструмент Oracle?

Краткий ответ - нет . К сожалению, способ сделать это в Oracle требует «большого количества скучных запросов». Статьи, на которые вы ссылаетесь, являются одними из лучших на эту тему. Файл данных действительно фрагментируется, поэтому даже если свободное пространство находится ниже самого высокого сегмента, Oracle не будет автоматически консолидировать его, когда RESIZE будет выполнено a .

Чтобы «дефрагментировать» табличное пространство, вам нужно переместить эти сегменты в начало файла данных, а не в конец. Для таблиц это автономный процесс, то есть таблица будет недоступна во время перемещения. Индексы можно перемещать либо в автономном режиме, либо с помощью Enterprise Edition их можно перемещать в режиме онлайн. Поскольку у вас есть окно отключения, я рекомендую вам выполнить следующие шаги.

A. Сжатие файлов данных со свободным пространством за отметкой максимальной воды. Это можно сделать следующим образом (запрос аналогичен процедуре Frosty Z):

Б. После того, как вы сузили положение выше верхней отметки, выясните, какие табличные пространства все еще выиграют от перемещения сегментов.

C. Для каждого из этих табличных пространств определите, какие сегменты необходимо переместить. (Замените USERS именем вашего табличного пространства или присоедините его к предыдущему запросу)

D. Переместите каждую таблицу и перестройте индексы и статистику.

E. повторите шаг A.

Я только что построил большинство этих запросов, так что вы захотите тщательно протестировать их перед использованием. Я полагаю, вы могли бы создать процедуру, которая использовалась бы EXECUTE IMMEDIATE для создания фактических операторов для динамического выполнения, но поскольку запросы будут получать ORA-08103: объект больше не существует, пока выполняется перемещение, я думаю, что лучше контролировать этот процесс вручную, даже если если это действительно означает немного больше времени / усилий.

Oracle оператор DELETE используется для удаления одной или нескольких записей из таблицы в Oracle.

Синтаксис

Синтаксис оператора DELETE в Oracle/PLSQL:

Параметры или аргументы

Таблица из которой вы хотите удалить записи.

Необязательный. Условия, которые должны быть выполнены для удаляемых записей. Если не предусмотрено никаких условий, то все записи из таблицы будут удалены.

Примечание

Вам не нужно перечислять поля в Oracle DELETE, поскольку вы удалите всю строку из таблицы.

Пример использования с одним условием

Рассмотрим простой Oracle пример DELETE, где в запросе DELETE есть только одно условие.

Этот пример DELETE удалит все записи из таблицы customers , где last_name является John.

Вы можете проверить количество строк, которые будут удалены. Вы можете определить количество строк, которые будут удалены, выполнив следующее Oracle предложение SELECT, перед выполнением удаления.

Пример использования двух условий

Рассмотрим пример, когда в DELETE просто два условия.

Этот пример DELETE удалит все записи из таблицы customers , где last_name является Anderson и customer_id больше 25.

Вы можете проверить количество строк, которые будут удалены. Вы можете определить количество строк, которые будут удалены, выполнив следующее предложение SELECT, перед выполнением удаления.

Пример использования условия EXISTS

Вы можете, также выполнять более сложные операции удаления.

Вы можете удалять записи в одной таблице на основе значений в другой таблице. Так как, при удалении, вы не можете перечислить более одной таблицы в FROM, вы можете использовать Oracle условие EXISTS.

Этот Oracle пример DELETE удалит все записи в таблице suppliers , где есть запись в таблице customers , чьи customer_id больше 25, а customer_id соответствует supplier_id .

Если вы хотите определить количество строк, которые будут удалены, вы можете запустить, перед выполнением удаления, следующее Oracle предложение SELECT.

SQL оператор DELETE используется для удаления одной или нескольких записей из таблицы.

Синтаксис

Синтаксис оператора DELETE в SQL:

Параметры или аргументы

table Таблица, из которой вы хотите удалить записи. WHERE conditions Необязательный. Условия, которые должны быть выполнены для удаления записей. Если никаких условий не предусмотрено, все записи в таблице будут удалены.

Примечание

Вам не нужно перечислять поля в операторе DELETE, так как вы удаляете всю строку из таблицы.

Пример оператора DELETE с одним условием

Если вы запустите оператор DELETE без условий в предложении WHERE, все записи из таблицы будут удалены. В результате вы чаще всего будете включать предложение WHERE, по крайней мере с одним условием, в свой оператор DELETE.

Давайте начнем с простого примера запроса DELETE, который имеет одно условие в предложении WHERE.

В этом примере у нас есть таблица suppliers со следующими данными:

supplier_id supplier_name city state
100 Yandex Moscow Moscow
200 Google Lansing Michigan
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania
700 Qwant Paris Ile de France
800 Facebook Menlo Park California
900 Electronic Arts San Francisco California

Введите следующий оператор DELETE:

Будет удалена 1 запись. Снова выберите данные из таблицы поставщиков:

Вот результаты, которые вы должны получить:

supplier_id supplier_name city state
200 Google Lansing Michigan
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania
700 Qwant Paris Ile de France
800 Facebook Menlo Park California
900 Electronic Arts San Francisco California

В этом примере удаляются все записи из таблицы suppliers , где supplier_name - Yandex.

Вы можете проверить количество строк, которые будут удалены. Вы можете определить количество строк, которые будут удалены, выполнив следующий запрос SELECT перед выполнением удаления:

Этот запрос вернет количество записей, которые будут удалены при выполнении оператора DELETE.

Пример - оператор DELETE с более чем одним условием

Вы можете иметь более одного условия в инструкции DELETE в SQL, используя либо условие AND, либо условие OR. Условие AND позволяет вам удалить запись, если все условия выполнены. Условие OR удаляет запись, если выполняется одно из условий.

Давайте рассмотрим пример использования оператора DELETE с двумя условиями с использованием условия AND.
В этом примере у нас есть таблица products со следующими данными:

product_id product_name category_id
1 Pear 50
2 Banana 50
3 Orange 50
4 Apple 50
5 Bread 75
6 Sliced Ham 25
7 Kleenex NULL

Введите следующий оператор DELETE:

Будет удалены 3 записи. Снова выберите данные из таблицы products :

Вот результаты, которые вы получите:

product_id product_name category_id
1 Pear 50
5 Bread 75
6 Sliced Ham 25
7 Kleenex NULL

В этом примере удаляются все записи из таблицы products , у которых category_id равен 50, а product_name НЕ 'Pear'.

Пример - использование EXISTS с оператором DELETE

Вы также можете выполнять более сложные удаления.

Вы можете удалить записи в одной таблице на основе значений в другой таблице. Поскольку вы не можете перечислить более одной таблицы в предложении FROM при выполнении удаления, вы можете использовать предложение EXISTS.

Для быстрой очистки таблиц в Oracle применяется специальный оператор TRUNCATE TABLE.
Данный оператор является оператором DDL, оператором мгновенного выполнения и поэтому для его вызова нам потребуется оператор динамического SQL.
Динамический SQL используется в ORACLE с помощью команды EXECUTE IMMEDIATE
Теория и практика
Оператор EXECUTE IMMEDIATE выполняет динамический оператор SQL или анонимный PL / SQL блок. В нашем случае мы будем использовать EXECUTE IMMEDIATE для работы с TRUNCATE TABLE.
Текст динамического SQL заключается в кавычки.
Оператор TRUNCATE TABLE используется для быстрого удаления всех записей из таблицы в Oracle. По результату аналогичен DELETE, без условий WHERE, но выполняется гораздо быстрее.
Синтаксис

Здесь
table_name
Таблица, которую вы хотите очистить.
PRESERVE MATERIALIZED VIEW LOG
Необязательный параметр. Если он задан, то MATERIALIZED VIEW LOG будет сохранено, когда таблица очищается. Это значение по умолчанию.
PURGE MATERIALIZED VIEW LOG
Необязательный параметр. Если он задан, то MATERIALIZED VIEW LOG будет очищен, когда таблица очищается.
DROP STORAGE
Необязательный параметр. Показывает, что всё хранилище очищающихся высвобождено, за исключением пространства, которое было выделено в MINEXTENTS.
REUSE STORAGE
Необязательный параметр. Если он задан, строки останется распределенными в таблице.

Этот пример очистит таблицу test1, и удалит все записи из этой таблицы.
Было бы равносильно следующему предложению DELETE в Oracle:

Оба эти примера приведут к тому, что все данные из таблицы test1 удаляется.
Иногда этот оператор не может быть выполнен без применения EXCUTE IMMEDIATE
Поэтому следует выполнять следующую команду

Этот пример очистит таблицу с именем test1.
Важные замечания
TRUNCATE TABLE выполняется сразу, изменения сразу будут базе, выполнения команды commit не потребуется.
При выполнении операции TRUNCATE TABLE, откат это операции будет невозможен.
Так же выполнении операцииTRUNCATE TABLE, нельзя будет извлечь данные из таблицы с помощью ретроспективного запроса.
Перед именем таблицы можно указать имя схемы, где создана данная таблица
Пример

Для выполнения оператора в другой схеме, системный администратор должен выдать вам права DROP ANY TABLE

думаю даже маломальски знакомый с базами данных Oracle знает об этом, по этому статья мягко говоря бесполезная.
Но если в статью добавить различные тонкости связанные с использованием данной команды, было бы на много лучше

Roman, если вам не пригодилась - не значит, что бесполезная?
После перехода с MS SQL, был крайне удивлен, что в PL/SQL нельзя просто написать "Truncate table . ".

можно ли удалить все содержимое схемы в Oracle? Я нашел этот скрипт:

но я хотел бы знать, есть ли что-нибудь,чтобы отбросить все в схеме,индексах, таблицах, противопоказаниях. но не схема (drop user . ).

обычно проще всего удалить и добавить пользователя. Это предпочтительный метод, если у вас есть доступ к базе данных system или sysdba.

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

затем я обычно очищаю корзину, чтобы действительно очистить вещи. Честно говоря, я не вижу большой пользы для корзины oracle и хотел бы, чтобы я мог отключите его, но в любом случае:

это приведет к созданию списка операторов drop. Не все из них будут выполняться - если вы упадете с каскадом, падение индексов PK_* завершится неудачей. Но, в конце концов, у вас будет довольно чистая схема. Подтвердите:

кроме того, просто чтобы добавить, блок Pl/sql в вашем вопросе удалит только таблицы, он не удаляет все другие объекты.

ps: скопировано с какого-то сайта, мне было полезно. Проверено и работает как обаяние.

Да, вы можете. Можно удалить пользователя и таким образом удалить объекты схемы. Инструкция DROP USER используется для удаления пользователя из базы данных Oracle и всех объектов, принадлежащих этому пользователю.

Если TestDB имеет объекты в своей схеме, вам нужно будет запустить следующую инструкцию пользователя DROP:

этот оператор удалит все объекты, принадлежащие TestDB, и все ограничения ссылочной целостности объектов TestDB также будут удалены.

следующий сценарий SQLplus генерирует операторы SQL, необходимые для удаления всех объектов схемы от нужного пользователя:

скрипт работает 100% для меня как есть-но если по какой-то причине он не завершен для вас, то он легко улучшается с помощью виртуальной машины (VM) следующим образом:

  1. войдите в систему как [ваш пользователь схемы для пустого]
  2. сделайте снимок вашей виртуальной машины
  3. запустите приведенный выше скрипт для создания удаления заявления
  4. выполнить удаление (вы можете игнорировать любые ошибки "объект не существует", так как некоторые объекты будут автоматически удалены до инструкции удаления скрипта. Это происходит в результате владения удаляемыми объектами)
  5. выход
  6. войдите в систему как SYS и выполните "drop user [ваш пользователь схемы для пустого];" -- без опции каскада

Если Шаг 6 терпит неудачу, вам нужно определить оставшиеся объекты предотвращение удаления пользователя и добавление его в вышеуказанный скрипт. Повторяйте, пока ваш пользователь не упадет (т. е. ваш скрипт является всеобъемлющим), затем сохраните свой скрипт

откат виртуальной машины к снимку и повторите шаги 3 и 4 (используя обновленный скрипт) - и теперь у вас должна быть 100% пустая схема.

Читайте также: