CREATE OR REPLACE PROCEDURE P_CONSTRAINT(V_TYPE VARCHAR2) IS
----------P_CONSTRAINT(外键约束禁用、启用 '适用于truncate table 报ORA-02266错时用到')-------------
/*----------------------------------------------------------
| AUTHOR:毛海晴 |
| USERS :外键约束禁用、启用'清空数据时用到' |
| BLOG : http://blog.itpub.net/28602568/viewspace-1696583/|
-----------------------------------------------------------*/
/*
注释:
由于在TRUNCATE表数据时有主外键约束,所以要将外键约束禁用。
判断约束是否是外键有2种:
1、USER_CONSTRAINTS视图中约束类型CONSTRAINT_TYPE = 'R';
2、R_CONSTRAINT_NAME IS NOT NULL;
*/
P_SQL_ENABLE VARCHAR2(1000);
P_SQL_DISABLE VARCHAR2(1000);
P_TABLE_NAME VARCHAR2(1000);
P_CONSTRAINT_NAME VARCHAR2(1000);
/*
USER_CONSTRAINTS : 用户的对象约束信息
CONSTRAINT_TYPE:
P:主键;
R:外键
C:非空约束/CHECK;
*/
--外键STATUS非DISABLED的表/约束.
CURSOR C_CONS_DISABLE IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS C
WHERE C.CONSTRAINT_TYPE = 'R'
AND C.STATUS != 'DISABLED';
--外键STATUS非ENABLED的表/约束.
CURSOR C_CONS_ENABLE IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS C
WHERE C.CONSTRAINT_TYPE = 'R'
AND C.STATUS != 'ENABLED';
BEGIN
---如果选择‘禁用’则调用以下循环. 将所有查出状态为ENABLED 改为DISABLED状态
IF V_TYPE = '禁用' THEN
FOR P_C_CONS_DISABLE IN C_CONS_DISABLE LOOP
P_TABLE_NAME := P_C_CONS_DISABLE.TABLE_NAME;
P_CONSTRAINT_NAME := P_C_CONS_DISABLE.CONSTRAINT_NAME;
P_SQL_DISABLE := 'ALTER TABLE ' || P_TABLE_NAME ||
' DISABLE CONSTRAINT ' || P_CONSTRAINT_NAME || '';
--DBMS_OUTPUT.PUT_LINE(P_SQL_DISABLE);
EXECUTE IMMEDIATE P_SQL_DISABLE;
END LOOP;
END IF;
---如果选择‘启用’则调用以下循环.将所有查出状态为DISABLED 改为ENABLED状态
IF V_TYPE = '启用' THEN
FOR P_C_CONS_ENABLE IN C_CONS_ENABLE LOOP
P_TABLE_NAME := P_C_CONS_ENABLE.TABLE_NAME;
P_CONSTRAINT_NAME := P_C_CONS_ENABLE.CONSTRAINT_NAME;
P_SQL_ENABLE := 'ALTER TABLE ' || P_TABLE_NAME ||
' ENABLE CONSTRAINT ' || P_CONSTRAINT_NAME || '';
--DBMS_OUTPUT.PUT_LINE(P_SQL_ENABLE);
EXECUTE IMMEDIATE P_SQL_ENABLE;
END LOOP;
END IF;
END P_CONSTRAINT;
*** 本文针对整个用户进行全部禁用外键,若有需要对表做过滤,可在本博客基础上改写..
【源于本人笔记】 若有书写错误,表达错误,请指正...
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28602568/viewspace-1696583/
,如需转载,请注明出处,否则将追究法律责任。