兩種方法
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括閔行網(wǎng)站建設(shè)、閔行網(wǎng)站制作、閔行網(wǎng)頁(yè)制作以及閔行網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,閔行網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到閔行省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1. 使用pl/sql developer
這種方法比較簡(jiǎn)單,我曾經(jīng)這么一次導(dǎo)入過(guò)幾萬(wàn)條記錄
2.sqlldr
首先將你的excel文件另存為csv格式(默認(rèn)逗號(hào)間隔,另存為csv,不只是改后綴名)
然后用sqlldr導(dǎo)入。sqlldr的參數(shù)很多,簡(jiǎn)單的幾個(gè)就可以了:
建一個(gè)控制文件control.txt:
load data
infile 'f:\test.csv'
into table test1
(id char terminated by ',',
name char terminated by ',',
height char terminated by ',',
birth char terminated by whitespace)
----這里你根據(jù)需要,修改數(shù)據(jù)文件的名字和路徑。括號(hào)里面的字段名和字段數(shù)也根據(jù)實(shí)際情況修改。由于保存的是csv,字段間以逗號(hào)隔開(kāi),因此控制文件里定義最后一個(gè)字段以whitespace來(lái)分隔,其它的用','
然后使用sql*loader:
sqlldr userid=USERNAME/PASSWORD@XXXX control=f:\control.txt log=f:\test.log bad=f:\testbad.csv
userid后跟用戶名密碼,@后的是網(wǎng)絡(luò)服務(wù)名,需要在客戶端的tnsnames.ora文件里定義。control后的值是剛剛建的控制文件的路徑,日志將生成在log參數(shù)指定的位置上,如果有記錄沒(méi)有導(dǎo)入成功,這些記錄會(huì)放置在bad后指定的文件里。
方法1。用sql server的“導(dǎo)入和導(dǎo)出數(shù)據(jù)”,我做項(xiàng)目的使用搞數(shù)據(jù)遷移就是用那玩意,配兩個(gè)數(shù)據(jù)源(Oracle、SQLServer各一),然后根據(jù)表也行、跟住SQL語(yǔ)句也行
方法2。SQL查詢分析器打開(kāi),查詢出來(lái)結(jié)果復(fù)制,用PLSQL打開(kāi)oralce的表,粘貼進(jìn)去
需要生成的SQL
insert into TMP_UPSTATE_CASEKEY values('TMP0000001', 1, sysdate);
存儲(chǔ)過(guò)程實(shí)現(xiàn)
create or replace procedure proc_casekey_upstate
as
casekey char(14);
begin
for i in 1..10000000 loop
casekey := 'TMP'||lpad(i,7,0); -- TMP0000001
insert into TMP_UPSTATE_CASEKEY values(casekey, 1, sysdate);
end loop;
commit;
end;
begin
proc_casekey_upstate();
end;
測(cè)試發(fā)現(xiàn)生成一千萬(wàn)條數(shù)據(jù)用了14分鐘左右,性能還是可以了,如果先去掉TMP_NUM_STATUS_ID的外鍵估計(jì)更快。
或者:
insert into TMP_UPSTATE_CASEKEY select 'TMP'||LPAD(rownum,7,0),1,sysdate from dual connect by level = 1000000;
一個(gè)例子你看看
create?or?replace?procedure?p_test?is
v_day????????????????varchar2(20);
nextday??????????????varchar2(20);
cur_value????????????number;
yes_value????????????number;
thismonth_totalvalue?number;
lastmonth_totalvalue?number;
i????????????????????number;
tempday??????????????varchar2(20);
day_count????????????integer;
begin
execute?immediate?'truncate?table?DM_KPID_IW_AREA';
v_day?:=?'20070101';
--?lastmonth_totalvalue?:=?0;
for?k?in?0?..?11?loop
tempday??????????????:=?to_char(add_months(to_date(v_day,
'yyyymmdd'),
k),
'yyyymmdd');
yes_value????????????:=?0;
thismonth_totalvalue?:=?0;
--?這里好像有一個(gè)比較方便的函數(shù)吧,記不清了
day_count?:=?to_char(last_day(to_date(tempday,?'yyyymmdd')),?'dd');
for?i?in?0?..?day_count?-?1?loop
nextday??????????????:=?to_char(to_date(tempday,?'yyyymmdd')?+?i,
'yyyymmdd');
cur_value????????????:=?trunc(dbms_random.value(1,?100),?0);
thismonth_totalvalue?:=?thismonth_totalvalue?+?cur_value;
begin
select?t.thismonth_totalvalue
into?lastmonth_totalvalue
from?dm_kpid_iw_area?t
where?t.day_id?=
--考慮如3月30日之類這樣的情況,前一月沒(méi)有對(duì)應(yīng)的日子的情況,
--如果此時(shí)上月值為0的話,則應(yīng)該為:
--to_char(add_months(to_date(nextday,?'yyyymmdd'),?-1),
--'yyyymm')?||?substr(nextday,?7,?2);??????????????????????
to_char(add_months(to_date(nextday,?'yyyymmdd'),?-1),
'yyyymmdd');
exception
when?no_data_found?then
lastmonth_totalvalue?:=?0;
end;
insert?into?dm_kpid_iw_area
(day_id,
cur_value,
yes_value,
thismonth_totalvalue,
lastmonth_totalvalue)
values
(nextday,
cur_value,
yes_value,
thismonth_totalvalue,
lastmonth_totalvalue);
yes_value?:=?cur_value;
commit;
end?loop;
end?loop;
end;
使用loop循環(huán),比如:
for item in (select a,b,c from table_a where 條件) loop
insert into table_b(a,b,c) values (item.a,item.b,item.c);
end loop;
也可以使用索引表循環(huán),以上只是一個(gè)簡(jiǎn)單的例子,需要根據(jù)你的具體情況選擇循環(huán)方式。
1、采用insert into values 語(yǔ)句插入一條,寫(xiě)很多條語(yǔ)句即可多條數(shù)據(jù),這種主要針對(duì)于離散值以及一些基礎(chǔ)信息的錄入,如:insert into test(xh,mc) values('123','測(cè)試');
如果插入的數(shù)據(jù)有規(guī)律,可利用for、loop循環(huán)插入,主要用于批量生成測(cè)試數(shù)據(jù)
begin
for i in 1 .. 100 loop
insert into test(xh,mc) values(i||'','測(cè)試');
end loop;
end ;。
2、采用insert into selct from 語(yǔ)句來(lái)一次性插入一個(gè)集合,這種主要依據(jù)于要插入的數(shù)據(jù)源已經(jīng)存儲(chǔ)于數(shù)據(jù)庫(kù)對(duì)象中,或者利用dual虛表來(lái)構(gòu)造數(shù)據(jù),經(jīng)過(guò)加工后寫(xiě)入一個(gè)集合。
insert into test (xh,mx) select '123','測(cè)試' from dual;
3、采用plsql等工具、或者oracle的imp、impdp命令來(lái)導(dǎo)入,這種主要用數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)之間的大批量數(shù)據(jù)導(dǎo)入,導(dǎo)入的數(shù)據(jù)格式為plsql的pde、oracle的dmp等。dmp文件可使用
table_exists_action參數(shù)控制導(dǎo)入動(dòng)作:replace替換原表,truncate清除原表數(shù)據(jù)再導(dǎo)入,append增量導(dǎo)入數(shù)據(jù),當(dāng)然impdp數(shù)據(jù)泵的導(dǎo)入要依賴于directory路徑。
impdp 用戶名/密碼 dumpfile=123.dmp logfile=123.log directory=imp_dir tables=test table_exists_action=append。
4、使用excel文件直接拷貝。這種主要用于要寫(xiě)入的數(shù)據(jù)已是excel文件或者行列分明的其它格式文件,每一列的值和表結(jié)構(gòu)相對(duì)應(yīng),可直接打開(kāi)表的行級(jí)鎖,把數(shù)據(jù)拷貝進(jìn)入。
批量插入數(shù)據(jù)腳本
1、第一種批量插入數(shù)據(jù)腳本,可以基本滿足要求。理解上較為簡(jiǎn)單,所以這個(gè)最常用。
NEXTVAL和CURRVAL的區(qū)別:
1、如果 sequence.CURRVAL 和 sequence.NEXTVAL 都出現(xiàn)在一個(gè) SQL 語(yǔ)句中,則序列只增加一次。在這種情況下,每個(gè) sequence.CURRVAL 和 sequence.NEXTVAL 表達(dá)式都返回相同的值,不管在語(yǔ)句中sequence.CURRVAL 和 sequence.NEXTVAL 的順序。
執(zhí)行腳本結(jié)果如下:
3、兩個(gè)表,同時(shí)批量插入數(shù)據(jù)的腳本
3、
4、 涉及子表時(shí),批量插入數(shù)據(jù)腳本,
5、 批量修改數(shù)據(jù) :
時(shí)間取數(shù)方式:
一、SYSTIMESTAMP(取當(dāng)前系統(tǒng)值)
二、SYSDATE(取當(dāng)前系統(tǒng)值,但只精確到時(shí),分和秒都為0)
三、固定值為:TO_TIMESTAMP ('2019-2-12 15:24:45.703000', 'yyyy-mm-dd hh24:mi:ss.ff6')
把固定的字段改為變量:
方式一:’||i||’ 例:’{“no”:“111’||i||’”}’(此方式)
方式二:concat 例:concat(concat(’{“blNo”:111"’,i),’"}’)