存储过程批量插入数据
㈠ 写一个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了,你试下吧