匯入過程中禁用約束

2021-07-09 19:30:28 字數 3887 閱讀 4931

oracle匯入資料其 實很簡單,但是如果資料存在約束:如主外來鍵、主鍵約束、唯一約束,可能給資料匯入帶來很大的麻煩。比如主外來鍵,如果批量匯入資料,是難於指定匯入的先後順 序的,相信有不少入門級朋友們,會遇到跟我一樣的問題。因此,為了節省大家的寶貴時間,特此分享自己的研究成果。 

個人解決方案為:在匯入過程中,先導入錶結構,再禁用約束,其次匯入資料,最終啟用約束即可。其核心就是禁用和啟用約束過程的建立。具體步驟如下:

1.匯出(分為2步):匯出結構、匯出資料 

–只匯出表結構 

$exp dev_sem/dev_sem@pcmdb file=d:\struct.dmp log=d:\struct.log rows=n; 

–匯出資料 

$exp dev_sem/dev_sem@pcmdb file=d:\data.dmp log=d:\data.log ;

2.匯入結構 

–匯入表結構 

$imp file=d:\struct.dmp log=d:\imp.log full=y;

3.編寫過程

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);

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

if upper(operation) in ('drop', 'disable') then

if fk then

begin

for e in r loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

end if;

if pk then

begin

for e in r loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

begin

for e in p loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

end if;

if uk then

begin

for e in u loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

end if;

elsif upper(operation) in ('enable') then

if pk then

begin

for e in p loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

end if;

if fk then

begin

for e in p loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

begin

for e in r loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

end loop;

end;

end if;

if uk then

begin

for e in u loop

st := 'alter table ' || e.table_name || ' ' || operation || '

constraint ' || e.constraint_name;

execute immediate (st);

dbms_output.put_line(st);

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;

/

–呼叫過程:禁用約束檢查 

exec manage_user_constraints(『disable』,true,true,true);

4.匯入資料 

$imp file=d:\data.dmp log=d:\data.log ignore=y full=y;

5.啟用約束 

exec manage_user_constraints(『enable』,true,true,true);

6.刪除過程 

drop procedure manage_user_constraints;

如上查詢即正確無誤的匯入資料,而不用擔心匯入的先後順序問題了。

面試過程中

面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...

儲存過程中呼叫儲存過程

use northwind go 儲存過程1 功能 通過員工firstname inputempfirstname 獲得 員工id outid if exists select name from sysobjects where name p getempleeidbyname and type ...

儲存過程中事務操作

資料庫中事務主要應用在多條語句的更新操作 插入 修改 刪除 可以保證資料的完整性與正確性。使用原則為盡可能少的影響資料,以免產生死鎖或者占用資源。在儲存過程中如果中間操作有非嚴重的錯誤資訊執行不會中斷,會繼續執行並返回相應結果。但是程式呼叫的話如果不是用 try catch形式則會報錯,出現黃頁。需...