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

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

DROP PROCEDURE IF EXISTS XYZ;

上述方法无效。

【问题讨论】:

  • 不,在 Oracle 中,您没有此功能。

标签: oracle procedure


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2012-10-18
    • 1970-01-01
    • 2016-03-03
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多