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;
如上查找即正确无误的导入数据,而不用担心导入的先后顺序问题了。
查看更多关于oracle避免约束带来的导入数据解决方案的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did238547