如果 DB Oracle 中存在删除过程

Posted

技术标签:

【中文标题】如果 DB Oracle 中存在删除过程【英文标题】:drop procedure if exists in DB Oracle 【发布时间】:2014-03-21 14:23:08 【问题描述】:

谁能告诉我如何在 Oracle 中删除 PROCEDURE,但前提是它存在?

DROP PROCEDURE IF EXISTS XYZ;

上述方法无效。

【问题讨论】:

不,在 Oracle 中,您没有此功能。 【参考方案1】:

如果您的目标是消除脚本中的错误消息,那么您可以尝试

begin
   execute immediate 'drop procedure xyz';
exception when others then
   if sqlcode != -4043 then
      raise;
   end if;
end;
/

【讨论】:

“其他人时例外”几乎总是一个等待发生的错误。在这种情况下,想法是删除过程 xyz,并屏蔽 ORA-04043 错误,如果您尝试删除的过程已经不存在,通常会发生这种错误。这很好,但是如果过程 XYZ 确实存在,但尝试删除的用户没有删除它的权限怎么办?下降会引发 ORA-01031,但由于“当其他人”,它会被忽略。具体来说,最好声明要忽略的异常,而不是使用“其他”。【参考方案2】:

您还可以查看之前的字典视图:

SELECT * FROM USER_PROCEDURES WHERE PROCEDURE_NAME = 'XYZ'

【讨论】:

请注意PROCEDURE_NAME 仅适用于包中的过程,您应该使用OBJECT_NAME 代替所有类型的函数 @EugeneK 在一个包中你无论如何都不能删除一个过程 所以你是说你的回答对话题启动没有帮助?【参考方案3】:

我的解决方案:

DECLARE
  V_NUM NUMBER;
BEGIN     
  SELECT COUNT(*)
  INTO   V_NUM
  FROM   USER_OBJECTS
  WHERE  OBJECT_NAME = 'XYZ'
  AND    OBJECT_TYPE = 'PROCEDURE'; 

  IF V_NUM > 0 THEN
    EXECUTE IMMEDIATE 'DROP PROCEDURE XYZ';
    DBMS_OUTPUT.PUT_LINE('Dropped');
  END IF;

END;
/

【讨论】:

【参考方案4】:

一个完整的例子:

declare
   c int;
begin
       select count(*) into c from user_procedures where object_type = 'FUNCTION' and object_name = 'ABC';
       if c = 1 then
          execute immediate 'DROP FUNCTION ABC';
       end if;
end;

【讨论】:

如果你有一个无效的过程(由于编译错误),这个无效的过程在USER_OBJECTSALL_OBJECTS中是listet,但在USER_PROCEDURESALL_PROCEDURES中没有列出。另见:Question 5721474

以上是关于如果 DB Oracle 中存在删除过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功

Oracle存储过程的语法分析

ORACLE 存储过程报错 PLS-00103 求查错

如果记录存在,Oracle 存储过程会更新行

如果在过程中不存在 Oracle 插入

安装Oracle 10g过程中出现指定的SID已经存在 怎么处理才可以继续安装