当前位置:数据库 > Oracle >>

oracle避免约束带来的导入数据解决方案

oracle避免约束带来的导入数据解决方案
 
Oracle导入数据其 实很简单,但是如果数据存在约束:如主外键、主键约束、唯一约束,可能给数据导入带来很大的麻烦。比如主外键,如果批量导入数据,是难于指定导入的先后顺 序的,相信有不少入门级朋友们,会遇到跟我一样的问题。因此,为了节省大家的宝贵时间,特此分享自己的研究成果。 个人解决方案为:在导入过程中,先导入表结构,再禁用约束,其次导入数据,最终启用约束即可。其核心就是禁用和启用约束过程的创建。具体步骤如下:
 
1.导出(分为2步):
导出结构、导出数据 –只导出表结构 $exp devsem/devsem@pcmdb file=d:\struct.dmp log=d:\struct.log rows=n; –导出数据 $exp devsem/devsem@pcmdb file=d:\data.dmp log=d:\data.log ;

2.导入结构 –导入表结构 $imp file=d:\struct.dmp log=d:\imp.log full=y;

 

 
3.编写过程
 
001
CREATE OR REPLACE PROCEDURE MANAGE_USER_CONSTRAINTS(OPERATION VARCHAR2,
002
                                                  FK        BOOLEAN DEFAULT TRUE,
003
                                                  PK        BOOLEAN DEFAULT TRUE,
004
                                                  UK        BOOLEAN DEFAULT TRUE) IS
005
ST VARCHAR2(255);
006
CURSOR R IS
007
  SELECT TABLE_NAME, CONSTRAINT_NAME
008
    FROM USER_CONSTRAINTS
009
   WHERE CONSTRAINT_TYPE = 'R';
010

011
CURSOR P IS
012
  SELECT TABLE_NAME, CONSTRAINT_NAME
013
    FROM USER_CONSTRAINTS
014
   WHERE CONSTRAINT_TYPE = 'P';
015

016
CURSOR U IS
017
  SELECT TABLE_NAME, CONSTRAINT_NAME
018
    FROM USER_CONSTRAINTS
019
   WHERE CONSTRAINT_TYPE = 'U';
020

021
BEGIN
022
IF UPPER(OPERATION) IN ('DROP', 'DISABLE') THEN
023
  IF FK THEN
024
    BEGIN
025
      FOR E IN R LOOP
026
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
027
              CONSTRAINT ' || E.CONSTRAINT_NAME;
028
        EXECUTE IMMEDIATE (ST);
029
        DBMS_OUTPUT.PUT_LINE(ST);
030
      END LOOP;
031
    END;
032
  END IF;
033
  IF PK THEN
034
    BEGIN
035
      FOR E IN R LOOP
036
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
037
              CONSTRAINT ' || E.CONSTRAINT_NAME;
038
        EXECUTE IMMEDIATE (ST);
039
        DBMS_OUTPUT.PUT_LINE(ST);
040
      END LOOP;
041
    END;
042
    BEGIN
043
      FOR E IN P LOOP
044
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
045
              CONSTRAINT ' || E.CONSTRAINT_NAME;
046
        EXECUTE IMMEDIATE (ST);
047
        DBMS_OUTPUT.PUT_LINE(ST);
048
      END LOOP;
049
    END;
050
  END IF;
051
  IF UK THEN
052
    BEGIN
053
      FOR E IN U LOOP
054
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
055
              CONSTRAINT ' || E.CONSTRAINT_NAME;
056
        EXECUTE IMMEDIATE (ST);
057
        DBMS_OUTPUT.PUT_LINE(ST);
058
      END LOOP;
059
    END;
060
  END IF;
061
ELSIF UPPER(OPERATION) IN ('ENABLE') THEN
062
  IF PK THEN
063
    BEGIN
064
      FOR E IN P LOOP
065
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
066
              CONSTRAINT ' || E.CONSTRAINT_NAME;
067
        EXECUTE IMMEDIATE (ST);
068
        DBMS_OUTPUT.PUT_LINE(ST);
069
      END LOOP;
070
    END;
071
  END IF;
072
  IF FK THEN
073
    BEGIN
074
      FOR E IN P LOOP
075
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
076
              CONSTRAINT ' || E.CONSTRAINT_NAME;
077
        EXECUTE IMMEDIATE (ST);
078
        DBMS_OUTPUT.PUT_LINE(ST);
079
      END LOOP;
080
    END;
081
    BEGIN
082
      FOR E IN R LOOP
083
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
084
              CONSTRAINT ' || E.CONSTRAINT_NAME;
085
        EXECUTE IMMEDIATE (ST);
086
        DBMS_OUTPUT.PUT_LINE(ST);
087
      END LOOP;
088
    END;
089
  END IF;
090
  IF UK THEN
091
    BEGIN
092
      FOR E IN U LOOP
093
        ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || '
094
              CONSTRAINT ' || E.CONSTRAINT_NAME;
095
        EXECUTE IMMEDIATE (ST);
096
        DBMS_OUTPUT.PUT_LINE(ST);
097
      END LOOP;
098
    END;
099
  END IF;
100
ELSE
101
  DBMS_OUTPUT.PUT_LINE('THE FIRST PARAMETER OF THE PROCEDURE MUST BE
102
                       DROP OR ENABLE OR DISABLE');
103
END IF;
104
END;
105
/

 

–调用过程:禁用约束检查 

exec MANAGEUSERCONSTRAINTS(‘disable’,true,true,true);

 

 
4.导入数据 $imp file=d:\data.dmp log=d:\data.log ignore=y full=y;

5.启用约束 exec MANAGEUSERCONSTRAINTS(‘enable’,true,true,true);

6.删除过程 drop procedure MANAGEUSERCONSTRAINTS;

 

如上查找即正确无误的导入数据,而不用担心导入的先后顺序问题了。
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,