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形式則會報錯,出現黃頁。需...