【发布时间】:2014-03-21 14:23:08
【问题描述】:
谁能告诉我如何在 Oracle 中删除 PROCEDURE,但前提是它存在?
DROP PROCEDURE IF EXISTS XYZ;
上述方法无效。
【问题讨论】:
-
不,在 Oracle 中,您没有此功能。
谁能告诉我如何在 Oracle 中删除 PROCEDURE,但前提是它存在?
DROP PROCEDURE IF EXISTS XYZ;
上述方法无效。
【问题讨论】:
如果您的目标是消除脚本中的错误消息,那么您可以尝试
begin
execute immediate 'drop procedure xyz';
exception when others then
if sqlcode != -4043 then
raise;
end if;
end;
/
【讨论】:
您还可以查看之前的字典视图:
SELECT * FROM USER_PROCEDURES WHERE PROCEDURE_NAME = 'XYZ'
【讨论】:
PROCEDURE_NAME 仅适用于包中的过程,您应该使用OBJECT_NAME 代替所有类型的函数
我的解决方案:
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;
/
【讨论】:
一个完整的例子:
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