改写了禁用或启用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.如果开启闪回可以使用闪回表. 怎样查看 ...
随机推荐
- 为什么返回的数据前面有callback?
这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? 打了几遍 JSON.parse 也都是不行…… ...
- bean的实例化有几种实现方式
三种实例化bean的方式 在spring中有三中实例化bean的方式: 一.使用构造器实例化:(90%通常使用的一个方法) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化. 每种实例化 ...
- webservice跨域问题
在webconfig里面加上 <httpProtocol> <customHeaders> <add name="Access-Co ...
- python 拷贝文件
使用绝对目录: import os import shutil shutil.copyfile("/opt/test/update.tar.gz","/opt/updat ...
- 四: 使用vue搭建网站前端页面
---恢复内容开始--- 在搭建路由项目的时候的基本步骤 一:创建项目 安装好vue 搭好环境 (步骤在上篇博客中) 进入项目目录 cd 目录路径/ 目录名 创建项目 ...
- nginx的使用教程
一.基本概念 1.1 正向代理和反向代理 (参考文档:https://www.cnblogs.com/hafiz/p/7233306.html) 假设我们给定客户端A.代理服务器B.以及最终服务器C ...
- 小程序scss页面布局
html <view class="main"> <form bindsubmit="feedback"> <textarea c ...
- ISNULL函数的深入讲解
1. 标题有点夸张 2. 今天做统计查询员工加班时长的时,因为要将NULL值导入到decimal类型的字段中,但是发现导入之后得字段不属于NULL也不等于0,因此在接下来的运算过程中就很难继续进行, ...
- Qt532.QSettings_默认分隔符
1.http://bbs.csdn.net/topics/391831509?page=1 2楼: QSettings读取配置文件的内容是以逗号作为分隔符,以分号作为结束符.遇到分号就结束了,后面的内 ...
- 学习笔记53—Wilcoxon检验和Mann-whitney检验的区别
Wilcoxon signed-rank test应用于两个related samples Mann–Whitney U test也叫Wilcoxon rank-sum test,应用于两个indep ...