Удалить все объекты на схеме в Oracle - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать сценарий для удаления всех объектов в базе данных, поэтому с помощью следующего выбора создайте процедуру для выполнения, которая оставит базу данных полностью чистой (без разрешения на удаление базы данных и ее повторное создание).,Сначала удалите все последовательности, индексы и т. Д., А затем таблицы.

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

Имея это в виду, я подумал, что что-то вроде этого может работать:

BEGIN

    FOR i IN (select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX'))
    LOOP
        EXECUTE IMMEDIATE i;
    END LOOP;

END;
/

Но я получаю:

Отчет об ошибке - ORA-06550: строка 5, столбец 27: PLS-00382: выражение имеет неправильный тип ORA-06550: строка 5, столбец 9: PL / SQL: оператор игнорируется 06550. 00000 - "строка% s, столбец% s: \ n% s "* Причина: обычно ошибка компиляции PL / SQL.* Действие:

Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

В целях тестирования я использую схему Скотта.Как только это становится слишком загрязненным, я отбрасываю все, кроме таблиц Скотта по умолчанию.Это мой сценарий;посмотрите, поможет ли это в вашем случае.

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

declare
  l_str varchar2(200);
begin
  for cur_r in (select object_name, object_type From user_objects 
                where object_name not in ('EMP', 'DEPT', 'BONUS', 'SALGRADE')
               )
  loop
    begin
      l_str := 'drop ' || cur_r.object_type || ' '|| cur_r.object_name;
      dbms_output.put_Line(l_str);
      execute immediate l_str;
    exception
      when others then null;
    end;
  end loop;
end;
/
0 голосов
/ 27 ноября 2018

execute immediate нужен строковый (или varchar2) аргумент.Вы даете ему строку курсора.Присвойте выбранному значению псевдоним и используйте его в качестве аргумента, и не используйте точку с запятой в выражении, например:

begin
  for i in (select 'drop ' || object_type || ' ' || object_name as stmt
              from user_objects
             where object_type in ('VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')) loop
    execute immediate i.stmt;
  end loop;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...