改写了网上某位大侠(最开始的源头是哪位没记住)写的禁用或启用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. 为什么返回的数据前面有callback?

    这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? 打了几遍 JSON.parse 也都是不行…… ...

  2. bean的实例化有几种实现方式

    三种实例化bean的方式   在spring中有三中实例化bean的方式: 一.使用构造器实例化:(90%通常使用的一个方法) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化. 每种实例化 ...

  3. webservice跨域问题

    在webconfig里面加上   <httpProtocol>      <customHeaders>        <add name="Access-Co ...

  4. python 拷贝文件

    使用绝对目录: import os import shutil shutil.copyfile("/opt/test/update.tar.gz","/opt/updat ...

  5. 四: 使用vue搭建网站前端页面

    ---恢复内容开始--- 在搭建路由项目的时候的基本步骤 一:创建项目 安装好vue 搭好环境 (步骤在上篇博客中) 进入项目目录      cd   目录路径/ 目录名 创建项目          ...

  6. nginx的使用教程

    一.基本概念 1.1 正向代理和反向代理 (参考文档:https://www.cnblogs.com/hafiz/p/7233306.html) 假设我们给定客户端A.代理服务器B.以及最终服务器C ...

  7. 小程序scss页面布局

    html <view class="main"> <form bindsubmit="feedback"> <textarea c ...

  8. ISNULL函数的深入讲解

    1.  标题有点夸张 2. 今天做统计查询员工加班时长的时,因为要将NULL值导入到decimal类型的字段中,但是发现导入之后得字段不属于NULL也不等于0,因此在接下来的运算过程中就很难继续进行, ...

  9. Qt532.QSettings_默认分隔符

    1.http://bbs.csdn.net/topics/391831509?page=1 2楼: QSettings读取配置文件的内容是以逗号作为分隔符,以分号作为结束符.遇到分号就结束了,后面的内 ...

  10. 学习笔记53—Wilcoxon检验和Mann-whitney检验的区别

    Wilcoxon signed-rank test应用于两个related samples Mann–Whitney U test也叫Wilcoxon rank-sum test,应用于两个indep ...