改写了禁用或启用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.如果开启闪回可以使用闪回表. 怎样查看 ...
随机推荐
- Java volatile 有什么作用
在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内 ...
- C+++string类如何判断字符串为空
string类是C++STL类之一,有很丰富的接口,判断string为空是经常用到的操作. string类为空,实际也就是元素为0个. 可以按照如下方式判断: 1.string类有自己的成员函数emp ...
- RN 数据持久化存储服务API
一些数据信息需要存储在手机内存中,比如用户的登录名密码 token啥的,所以这就需要了来存这些信息 在RN中 采用了AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它 ...
- python3.5学习第一章
在python中,变量赋值或者其他语句后不需要加”:“ python中,缩进特别重要! 条件语句和循环语句,要加”:“ 一.变量赋值 name = "cecelia"name2 = ...
- PCB板的三种敷铜方法解析
1 do not pour over all same net objects:仅仅对相同网络的焊盘进行连接,其他如覆铜.导线不连接. 2 pour over all same net objects ...
- Linux性能测试工具-UnixBench
■下载路径: unixbench-5.1.2.tar.gz :http://soft.vpser.net/test/unixbench/ unixbench-5.1.3.tar.gz :http:// ...
- 安卓自动化测试——rf
${a} Get Text //android.widget.TextView[contains(@text,"历史位置")]/../../../android.widget.Li ...
- 编写脚本,出现 TypeError: exceptions must be old-style classes or derived from BaseException, not unicode怎样解决?
小编使用robot framework,在编写安卓自动化脚本时,出现这样的情况: 在网上搜了好久,发现都是python的解决方法,到底怎样解决robot里面的问题呢?最终发现: (1)代码中我是这样写 ...
- 虚拟机vmnet0、vmnet1和vmnet8的区别
vmnet0,实际上就是一个虚拟的网桥 vmnet0,实际上就是一个虚拟的网桥,这个网桥有很若干个端口,一个端口用于连接你的Host,一个端口用于连接你的虚拟机,他们的位置是对等的,谁也不是谁的网关. ...
- Skip level 1 on 1
2019-01-08 16:43:29 Skip level 1:1 什么是 Skip level 1 on 1 :你和你老板的老板(的老板) 1:1 如果你的老板是first line manag ...