如果 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_OBJECTS
和ALL_OBJECTS
中是listet,但在USER_PROCEDURES
和ALL_PROCEDURES
中没有列出。另见:Question 5721474以上是关于如果 DB Oracle 中存在删除过程的主要内容,如果未能解决你的问题,请参考以下文章