Skip to content

删除存储过程

语法格式

sql
DropProcedureStmt::=
    DROP PROCEDURE [IF EXISTS] name_space alter_behavior

alter_behavior::=
    [CASCADE | RESTRICT]

参数说明

  • IF EXISTS:删除时存储过程或函数不存在,忽略此错误。
  • alter_behavior:若该参数不提供则默认使用RESTRICT,在删除存储过程或函数时会检测存储过程或存储函数是否被其他对象依赖,若存在依赖则删除失败,若无依赖则删除成功;CASCADE则表示强制删除存储过程或存储函数,强制删除被依赖对象后,数据库还会对依赖对象的valid状态进行对应处理。

示例

由于存储过程pro2依赖于pro1,因此在尝试删除pro1时,数据库阻止了这一操作以保护依赖关系。使用CASCADE强制删除。

sql
-- 创建存储过程pro1
SQL> CREATE OR REPLACE PROCEDURE pro1 IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('abc');
END;
/

-- 创建存储过程pro2
SQL> CREATE PROCEDURE pro2 IS
BEGIN
    EXEC pro1;
END;
/

-- 默认方式删除pro1返回错误
SQL> DROP PROCEDURE pro1;
Error: [E9002] 存在对存储过程或函数PRO1依赖的对象

SQL> SELECT valid FROM user_procedures WHERE proc_name='PRO2';

VALID | 
------------------------------------------------------------------------------
T |

-- 强制删除pro1
SQL> DROP PROCEDURE pro1 CASCADE;

SQL> SELECT valid FROM user_procedures WHERE proc_name='PRO2';

VALID | 
------------------------------------------------------------------------------
F |