存儲過程批量插入數據
㈠ 寫一個oracle存儲過程
大致寫了下,需要藉助一個臨時表,所有的更新在臨時中進行,最後合並到正式表中,代碼如下,可以根據實際的業務邏輯改一下,供參考
sql">--首先創建臨時表
createtableODS_TRANS_TMPas
select*fromODS_TRANSwhere1=2;
--下面為更新的存儲過程
createorreplaceprocerep_update_opp_acctis
begin
--向臨時表寫入數據
insertintoODS_TRANS_TMP--將需要更新的記錄,插入到臨時表
select*
fromODS_TRANSt
whereDR_CR_FLAG=1
andOPP_ACCT_NUMisnull
andTRANS_IDin(select1
from(selectTRANS_ID,TRANS_DT
fromODS_TRANS
whereOPP_ACCT_NUMisnull
groupbyTRANS_ID,TRANS_DT
havingcount(1)=2)a--首先找到對方賬號為空的記錄,按TRANS_ID,TRANS_DT分組,必須同時為2條
wheret.TRANS_ID=a.TRANS_ID
andt.TRANS_DT=a.TRANS_DT);
--臨時表中,更新對方賬號欄位
mergeintoODS_TRANS_TMPa
using(selectTRANS_ID,TRANS_DT,ACCT_NUM
fromODS_TRANS_TMP
whereDR_CR_FLAG=1)b
on(a.DR_CR_FLAG=0anda.TRANS_ID=b.TRANS_IDanda.TRANS_DT=b.TRANS_DT)
whenmatchedthen
updateseta.OPP_ACCT_NUM=b.ACCT_NUM;
mergeintoODS_TRANS_TMPa
using(selectTRANS_ID,TRANS_DT,ACCT_NUM
fromODS_TRANS_TMP
whereDR_CR_FLAG=0)b
on(a.DR_CR_FLAG=1anda.TRANS_ID=b.TRANS_IDanda.TRANS_DT=b.TRANS_DT)
whenmatchedthen
updateseta.OPP_ACCT_NUM=b.ACCT_NUM;
--臨時表合並到正式表
mergeintoODS_TRANSa
usingODS_TRANS_TMPb
on(a.TRANS_ID=b.TRANS_IDanda.TRANS_DT=b.TRANS_DTanda.DR_CR_FLAG=b.DR_CR_FLAG)
whenmatchedthen
updateseta.OPP_ACCT_NUM=b.OPP_ACCT_NUM;
--刪除臨時表中的數據
deletefromODS_TRANS_TMP;
commit;
exception
whenothersthen
rollback;
end;
㈡ oracle存儲過程怎樣批量插入新數據
需要生成的SQL
insert into TMP_UPSTATE_CASEKEY values('TMP0000001', 1, sysdate);
存儲過程實現
create or replace procere 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;
測試發現生成一千萬條數據用了14分鍾左右,性能還是可以了,如果先去掉TMP_NUM_STATUS_ID的外鍵估計更快。
或者:
insert into TMP_UPSTATE_CASEKEY select 'TMP'||LPAD(rownum,7,0),1,sysdate from al connect by level <= 1000000;
㈢ c#怎樣向sqlserver批量插入數據
C#和MS SQL交互使用的技術叫做 ADO.NET。 使用ADO.NET可以方便的對SQL SERVER 進行操作。
(如果你對ADO.NET不了解,建議先MSDN一下)
批量插入數據,有兩種方式,
1,數據比較復雜但是量不是很大,(這個大小的概念要視你的硬體、網路而定,一般在100萬條以上才叫大)。
使用FOR循環進行插入, 即聲明連接(conn.Open)然後進行遍歷,
一條一條插入資料庫(執行Insert語句),
一般來說,100W條數據,如果插入本機資料庫的話, 耗時一般在40S-1分鍾左右,
也可以在SqlServer中創建一個存儲過程來執行Insert命令, 遍歷時只需要調用存儲過程即可, 存儲過程的執行效率比Sql語句要高很多,因為不需要每次都編譯。
100W條數據用存儲過程來執行的話,一般耗時在20S左右,。
2數據量巨大,但是類型較簡單,(一般指上百萬條數據)
使用ADO.NET提供的BulkCopy,即批量導入,
語法:
publicstaticvoidBulkToDB(DataTabledt,stringTableName)
{
SqlConnectionsqlConn=newSqlConnection(
ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString);
SqlBulkCopybulkCopy=newSqlBulkCopy(sqlConn);
bulkCopy.BulkCopyTimeout=600;
bulkCopy.DestinationTableName=TableName;
bulkCopy.BatchSize=dt.Rows.Count;
try
{
sqlConn.Open();
if(dt!=null&&dt.Rows.Count!=0)
bulkCopy.WriteToServer(dt);
}
catch(Exceptionex)
{
throwex;
}
finally
{
sqlConn.Close();
if(bulkCopy!=null)
bulkCopy.Close();
}
}
需要傳入一個DataTable,一個表名。
這種方式速度非常快,同樣100W條數據,本機導入,大概3-5秒就可以完成,
但是需要注意,傳入的DataTable必須和Sql Server中的表結構一模一樣,
比如你的表有3列,分別是Name, Age, Sex。 你傳入的DataTable也必須是如此,所以這種方式只適合導入一些基礎數據, 並不適合作為數據層的常用方法。
如果數據量巨大又要求很高的效率,更建議使用NoSql資料庫
㈣ 怎麼寫存儲過程,向資料庫中批量插入數據
用循環語句生成欄位值insert
SQL 如下:
createprocereInsertTest
as
begin
declare@iint
declare@svarchar(20)
set@i=1
while@i<=100
begin
select@s=cast(@iASvarchar(20))
insertintotest(A,B,C,D)VALUES('a'+@s,'b'+@s,'ccccc','ddddd')
SET@i=@i+1
end
end
㈤ sqlserver 存儲過程大批量數據插入
可使用Merge Into 語句完成操作。
具體用法參考文章:http://www.cnblogs.com/biwork/p/3370335.html
㈥ mysql存儲過程怎樣批量插入數據
一下代碼運行通過:
delimiter$$;
createprocerelucia_proc16(countint)
begin
DECLAREname_procVARCHAR(20)CHARACTERSETutf8;
DECLAREsex_procVARCHAR(4)CHARACTERSETutf8;
DECLAREage_procINT(10);
DECLAREclass_procVARCHAR(20)CHARACTERSETutf8;
DECLAREAddr_procVARCHAR(50)CHARACTERSETutf8;
DECLAREiINT;
seti=1;
setsex_proc='女';
setage_proc=20;
setclass_proc='山治班';
setAddr_proc='北京市朝陽區';
whilei<countdo
setname_proc=CONCAT('露西亞',i);
insertintostudents(Name,Sex,age,class,Addr)values(name_proc,sex_proc,age_proc,class_proc,Addr_proc);
seti=i+1;
endwhile;
end
$$;
delimiter;
代碼功能:
傳入一個行數,控制插入多少條數據
運行效果:
㈦ oracle 用存儲過程將某一些表裡面的數據查出來之後,批量插入另一張大表中,並判斷,若有些已經存在的數據
MERGE INTO table1 p
USING table2 np
ON (p.proct_id = np.proct_id)
WHEN MATCHED THEN
UPDATE
SET p.proct_name = np.proct_name,
WHEN NOT MATCHED THEN
INSERT
VALUES (np.proct_id, np.proct_name, np.category)
備註:
table1:是要插入數據的目標表
table2 :是數據的來源表
針對你提出的需求是不用寫存儲過程的,上面的sql就完全可以實現;當然,你將上面的sql代碼
放到過程體裡面就OK了,你試下吧