Oracle: как отбрасывать процедуры, соответствующие маске имени - PullRequest
0 голосов
/ 19 октября 2018

Я создал две процедуры, такие как:

CREATE OR REPLACE procedure PARTNER_OWNER.test_1
 as begin

     dbms_output.put_line('Hello World 1 !'); 
 end;

и

CREATE OR REPLACE procedure PARTNER_OWNER.test_2
 as begin

     dbms_output.put_line('Hello World 2 !'); 
 end;

Теперь мне нужно отбросить процедуры одновременно (что-то вроде):

drop procedure PARTNER_OWNER.test_*;

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Один из вариантов - использовать динамический SQL.Вот пример:

SQL> create or replace procedure test_1
  2   as begin
  3       dbms_output.put_line('Hello World 1 !');
  4   end;
  5  /

Procedure created.

SQL> create or replace procedure test_2
  2   as begin
  3       dbms_output.put_line('Hello World 2 !');
  4   end;
  5  /

Procedure created.

SQL> exec test_1;
Hello World 1 !

PL/SQL procedure successfully completed.

SQL> exec test_2;
Hello World 2 !

PL/SQL procedure successfully completed.

Теперь, отбросьте их:

SQL> begin
  2    for cur_r in (select object_name from user_objects
  3                  where object_type = 'PROCEDURE'
  4                    and object_name like 'TEST%')
  5    loop
  6      execute immediate 'drop procedure ' || cur_r.object_name;
  7    end loop;
  8  end;
  9  /

PL/SQL procedure successfully completed.

Результат:

SQL> exec test_1;
BEGIN test_1; END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'TEST_1' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL> exec test_2;
BEGIN test_2; END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'TEST_2' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

В качестве альтернативы, вместо использования анонимного PLБлок / SQL, вы можете переписать его в процедуру и использовать позже.Поскольку он принимает параметр, вы можете удалить любую процедуру.Обратите внимание на LIKE (чтобы не отказываться от процедуры, которую вы на самом деле не хотели).

SQL> create or replace procedure p_drop_prc(par_procedure_name in varchar2)
  2  is
  3  begin
  4    for cur_r in (select object_name from user_objects
  5                  where `enter code here`object_type = 'PROCEDURE'
  6                    and object_name like upper(par_procedure_name) ||'%')
  7    loop
  8      execute immediate 'drop procedure ' || cur_r.object_name;
  9    end loop;
 10  end;
 11  /

Procedure created.

SQL> exec p_drop_prc('test');

PL/SQL procedure successfully completed.

SQL> exec test_1;
BEGIN test_1; END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'TEST_1' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL>

Кроме того, вы можете добавить еще один параметр - тип объекта - так, чтобы вы могли удалить любой объект, а не просто процедуру.

Очевидно, довольно много вариантов;выберите тот, который вы считаете наиболее подходящим.

0 голосов
/ 19 октября 2018

Я бы использовал оператор select, чтобы сгенерировать операторы drop, а затем запустить их.

select 'DROP PROCEDURE PARTNER_OWNER.'||object_name||';'
from dba_objects
where object_name like 'TEST_%' and
      owner = 'PARTNER_OWNER';

Bobby

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...