改写了网上某位大侠(最开始的源头是哪位没记住)写的禁用或启用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数据库的约束的存储过程的更多相关文章

  1. SQL Server 临时禁用和启用所有外键约束(高版本向低版本迁移数据)

    --获得禁用所有外键约束的语句 select 'ALTER TABLE [' + b.name + '] NOCHECK CONSTRAINT ' + a.name +';' as 禁用约束 from ...

  2. 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】

    疑问:怎样判断存储过程执行之后返回值是否为空. 一.连接oracle数据库 1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\p ...

  3. Oracle数据库PLSQL编程和存储过程

    一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...

  4. Oracle 数据库数据结构(包括存储过程,函数,表,触发器等)版本控制器

    原理: 写系统触发器,在修改数据库结构的时候,把DDL写入表中 create sequence A_Ver_Control_seq minvalue nomaxvalue start incremen ...

  5. oracle数据库中函数和存储过程中的区别

    一.函数必须有返回值,过程没有返回值: 二.函数可以单独执行,过程必须通过execute执行: 三.函数可以嵌入SQL中执行,过程不能. 可以将比较复杂的查询写成函数,然后在过程中调用.

  6. oracle数据库 唯一约束的创建与删除

    1.创建索引: alter table TVEHICLE add constraint CHECK_ONLY unique (CNUMBERPLATE, CVIN, CPLATETYPE, DWQCH ...

  7. Oracle数据库添加约束

    主键约束(两个特性)1:主键必须写2:主键不可重复 create table stu01( sid varchar(100), sname varchar2(100) --constraint PK_ ...

  8. ORACLE数据库异步IO介绍

    异步IO概念 Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能.它是Linux 2.6 版本内核的一个标准特性,当然我们在2.4 版本内核的补丁中也可以找到它.AIO 背 ...

  9. oracle数据库表恢复到特定时间点

    某一张表被应用软件里误操作把数据都清空了,现在想恢复到清空之间,比如2013年8月13日14点以前,应该怎样操作? 通过这个问题可以引发一系列的知识点串联. 1.如果开启闪回可以使用闪回表. 怎样查看 ...

随机推荐

  1. pyqt5 窗口无边框和透明

    https://blog.csdn.net/FanMLei/article/details/79433229 按钮圆形方法属性border-radius:30px; QScrollArea 无法滚动用 ...

  2. js判断数字、整数、字符串、布尔,特殊方法

    整数: function isInteger(obj) { return Math.floor(obj) === obj } isInteger(3) // true isInteger(3.3) / ...

  3. 51nod 1689 逛街(优先队列)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1689 题意: 题意: 枚举终点,这样就确定路上的花费,接下来只需要计算进 ...

  4. vue中click阻止事件冒泡,防止触发另一个事件

    在使用el-upload组件时,在其中放置了一个删除按钮的图片. 当点击图片,本想只删除上传的视频,但是意外触发了el-upload中的事件 解决办法:用stop,结果只删除当前预览,不触发上传事件. ...

  5. RN中关于IOS和Android的相关权限的问题

    在日常的开发中,时常需要去获取应用的一权限 比如查看通讯录/打开摄像机等 1:ios  iOS 的权限管理在info.plist里设置 info.plist主要是管理了app 的一些信息文件,比如版本 ...

  6. python requests post和get

    import requests import time import hashlib import os import json from contextlib import closing impo ...

  7. 1. eclipse异常问题解决办法

    1. 内存溢出问题 问题描述:报错信息 java.lang.OutOfMemoryError: PermGen space 解决办法: 在Tomcat/bin/catalina.bat 文件下加入: ...

  8. Python 增强类库

    程序中断 # coding=utf-8 支持中文 re = iter(range(5)) try: for i in range(100): print re.next() except StopIt ...

  9. 转载 R语言颜色基础设置

    原文链接:http://www.biostatistic.net/thread-5065-1-1.html R语言在画图形的时候,经常遇到颜色设定问题,用户可以根据color.rgb值和hsv值来设定 ...

  10. 《剑指offer》第五十三题(数组中数值和下标相等的元素)

    // 面试题53(三):数组中数值和下标相等的元素 // 题目:假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实 // 现一个函数找出数组中任意一个数值等于其下标的元素.例如,在数组{ ...