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

2014-11-24 02:03:21 · 作者: · 浏览: 8
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.P