改写了禁用或启用oracle数据库的约束的存储过程
改写了网上某位大侠(最开始的源头是哪位没记住)写的禁用或启用oracle数据库所有约束的存储过程,增加了异常控制,以使发生异常时也可以执行下去。
–调用过程:
执行前先 set serveroutput on; ----以便打印出输出
禁用约束检查 exec MANAGE_USER_CONSTRAINTS('disable',true,true,true);
启用约束 exec MANAGE_USER_CONSTRAINTS('enable',true,true,true);
CREATE OR REPLACE PROCEDURE MANAGE_USER_CONSTRAINTS(OPERATION VARCHAR2,
FK BOOLEAN DEFAULT TRUE,
PK BOOLEAN DEFAULT TRUE,
UK BOOLEAN DEFAULT TRUE) IS
ST VARCHAR2(255);
errorCode number; --异常编码
errorMsg varchar2(1000); --异常信息
out_return varchar2(1000);
flag varchar2(10);
CURSOR R IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R';
CURSOR P IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'P';
CURSOR U IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'U';
BEGIN
DBMS_OUTPUT.ENABLE(buffer_size => null) ; ---不限制缓存
IF UPPER(OPERATION) IN ('DROP', 'DISABLE') THEN
IF FK THEN
BEGIN
FOR E IN R LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
EXECUTE IMMEDIATE (ST);
DBMS_OUTPUT.PUT_LINE(ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
END IF;
IF PK THEN
BEGIN
FOR E IN R LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
EXECUTE IMMEDIATE (ST);
DBMS_OUTPUT.PUT_LINE(ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
BEGIN
FOR E IN P LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
DBMS_OUTPUT.PUT_LINE(ST);
EXECUTE IMMEDIATE (ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
END IF;
IF UK THEN
BEGIN
FOR E IN U LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
EXECUTE IMMEDIATE (ST);
DBMS_OUTPUT.PUT_LINE(ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
END IF;
ELSIF UPPER(OPERATION) IN ('ENABLE') THEN
IF PK THEN
BEGIN
FOR E IN P LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
DBMS_OUTPUT.PUT_LINE(ST);
EXECUTE IMMEDIATE (ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
END IF;
IF FK THEN
BEGIN
FOR E IN P LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
DBMS_OUTPUT.PUT_LINE(ST);
EXECUTE IMMEDIATE (ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
BEGIN
FOR E IN R LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
DBMS_OUTPUT.PUT_LINE(ST);
EXECUTE IMMEDIATE (ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
END IF;
IF UK THEN
BEGIN
FOR E IN U LOOP
begin
ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
CONSTRAINT ' || UPPER(E.CONSTRAINT_NAME);
DBMS_OUTPUT.PUT_LINE(ST);
EXECUTE IMMEDIATE (ST);
EXCEPTION
when others then
errorCode := SQLCODE;
errorMsg := SUBSTR(SQLERRM, 1, 200);
flag := 'false';
out_return := 'flag=' || flag || ',errorCode=' || errorCode || ',errorMsg=' || errorMsg;
dbms_output.put_line(out_return);
null;
end;
END LOOP;
END;
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE('THE FIRST PARAMETER OF THE PROCEDURE MUST BE
DROP OR ENABLE OR DISABLE');
END IF;
END;
/
改写了禁用或启用oracle数据库的约束的存储过程的更多相关文章
- SQL Server 临时禁用和启用所有外键约束(高版本向低版本迁移数据)
--获得禁用所有外键约束的语句 select 'ALTER TABLE [' + b.name + '] NOCHECK CONSTRAINT ' + a.name +';' as 禁用约束 from ...
- 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】
疑问:怎样判断存储过程执行之后返回值是否为空. 一.连接oracle数据库 1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\p ...
- Oracle数据库PLSQL编程和存储过程
一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...
- Oracle 数据库数据结构(包括存储过程,函数,表,触发器等)版本控制器
原理: 写系统触发器,在修改数据库结构的时候,把DDL写入表中 create sequence A_Ver_Control_seq minvalue nomaxvalue start incremen ...
- oracle数据库中函数和存储过程中的区别
一.函数必须有返回值,过程没有返回值: 二.函数可以单独执行,过程必须通过execute执行: 三.函数可以嵌入SQL中执行,过程不能. 可以将比较复杂的查询写成函数,然后在过程中调用.
- oracle数据库 唯一约束的创建与删除
1.创建索引: alter table TVEHICLE add constraint CHECK_ONLY unique (CNUMBERPLATE, CVIN, CPLATETYPE, DWQCH ...
- Oracle数据库添加约束
主键约束(两个特性)1:主键必须写2:主键不可重复 create table stu01( sid varchar(100), sname varchar2(100) --constraint PK_ ...
- ORACLE数据库异步IO介绍
异步IO概念 Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能.它是Linux 2.6 版本内核的一个标准特性,当然我们在2.4 版本内核的补丁中也可以找到它.AIO 背 ...
- oracle数据库表恢复到特定时间点
某一张表被应用软件里误操作把数据都清空了,现在想恢复到清空之间,比如2013年8月13日14点以前,应该怎样操作? 通过这个问题可以引发一系列的知识点串联. 1.如果开启闪回可以使用闪回表. 怎样查看 ...
随机推荐
- hihoCoder 1515 分数调查(带权并查集)
http://hihocoder.com/problemset/problem/1515 题意: 思路: 带权并查集的简单题,计算的时候利用向量法则即可. #include<iostream&g ...
- 搭建 FTP 文件服务
1.安装并启动 FTP 服务 2.配置 FTP 权限 3.准备域名和证书 4.访问 FTP 安装 VSFTPD 使用 yum 安装 vsftpd: yum install vsftpd -y vsft ...
- 小程序之取标签中内容 例如view,text
// index.wxml页面 data-url为自定义 {{}}中内容可为后台请求到的数据 也可为固定内容例如:data-text="哈哈哈" data-url="ht ...
- _event_worldstate
EventId 事件ID ID WorldStateUI.dbc第10列数字部分 StartValue 起始值 Entry 更新世界状态需要击杀生物或摧毁物体的entry,正数为生物,负数为物体 St ...
- _itemmod_nopatch、_itemmod_nopatch_level、_itemmod_nopatch_spell、_itemmod_nopatch_src、_itemmod_nopatch_stat、_itemmod_nopatch_stat_prefix
原始物品(_itemmod_nopatch中Entry)需要能够装备 该功能产生的新物品不需要制作dbc 尽量避免配置主动技能(_itemmod_nopatch_spell) _itemmod_nop ...
- 【BZOJ】4011: [HNOI2015]落忆枫音
题目链接:http://blog.csdn.net/popoqqq/article/details/45194103 写代码的时候也没有很清晰....具体看这里吧 #include<iostre ...
- spring集成shiro报错解决(no bean named 'shiroFilter' is defined)
引言: 本人在使用spring集成shiro是总是报“no bean named 'shiroFilter' is defined”,网上的所有方式挨个试了一遍,又检查了一遍, 还是没有解决,最后,抱 ...
- Java——Collections
反转数组 Collections.reserve(ArrayList) 例子如下 /** * public class ListNode { * int val; * ListNode next = ...
- Calendar的使用注意
一.Calendar和GregorianCalendar的关系 GregorianCalendar的一点: // 初始化 Gregorian 日历 // 使用当前时间和日期 // 默认为本地时间和时区 ...
- python 修改excel
操作描述:需要实现数据不断写入的功能,首先,在固定位置建立一个空白的xls文件:其次,每次产生的数据先判断该xls已有几列数据,后缀上去. 具体过程: 要保证具有三个包,是xlrd,xlwt,xlut ...