Oracle:如何删除与名称掩码匹配的过程

时间:2018-10-18 21:04:22

标签: oracle

我创建了两个过程,例如:

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 :(得分:0)

我将使用select语句生成drop语句,然后运行它们。

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

鲍比

答案 1 :(得分:0)

一种选择是使用动态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>

此外,您可以添加另一个参数-对象类型-这样就可以删除 any 对象,而不仅仅是过程。

很显然,有很多选择。选择最合适的那个。