改写了网上某位大侠(最开始的源头是哪位没记住)写的禁用或启用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. demoshow - webdemo展示助手

    demoshow - web demo展示助手 动态图演示页面: http://www.cnblogs.com/daysme/p/6790829.html 一个用来展示前端网页demo的小“助手”,提 ...

  2. 4、iptables扩展匹配及网络防火墙功能

    关于centos7   firewalld    http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html 如何保存及重载规则: ...

  3. python运维小技巧

    以下实验均在Linux上进行 1.一秒钟启动一个下载服务器 python版本 python2:  #python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 ...

  4. sap hana 数据库 EBS

    SAP实时数据平台详解 ************************************************************ EBS是Oracle 公司对原有应用产品整合后的一个产 ...

  5. Reference SoftReference WeakReference PhantomReference Cleaner 的研究与实践

    最近在看netty的时候看到直接内存的相关概念,为了更详细的了解一下具体原理,搜到了一篇不错的文章 http://lovestblog.cn/blog/2015/05/12/direct-buffer ...

  6. pyqt 不规则形状窗口显示

    #coding=utf- import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplicatio ...

  7. js 捕获浏览器后退事件

    $(document).ready(function(e) {             var counter = 0;             if (window.history &&am ...

  8. Oracle(限定查询2)

    3.2 对数据进行限定查询 在标准SQL之中定义了许多的运算符. 3.2.1.关系运算符 范例: 范例: 范例: 在使用关系运算符判断字符数据的时候注意大小写的编写问题.因为Oracle是区分大小写的 ...

  9. R 的内部机制

    在前面的章节中,我们已经学习了 R 语言的基础功能,并且了解了如何运用向量.矩阵.列表和数据框表示不同形式的数据,以及用内置函数解决简单的问题.但是仅仅了解这些功能并不能解决所有问题.现实中的数据分析 ...

  10. PowerDesign的简单使用方法

    PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...