前两天接到一个需求——需要编程将SQL Server中的数据插入至Oracle 数据大约有 多万条记录 开始的时候我采取了直接构建SQL插入的方式 结果耗时太长 为了提高性能我上网找了资料 最终采用DataAdapter批量插入至Oracle 提高了性能
代码如下
一 直接构建SQL语句插入
VB NET
sw Start()
Read Z J from SQL Server
Dim sqlCmd As New SqlCommand()
sqlCmd Connection = sqlConnection
sqlCmd CommandText = SELECT * FROM Z J
Dim sqlDr As SqlDataReader
sqlDr = sqlCmd ExecuteReader()
Dim cmdInsertZ J As New OracleCommand()
cmdInsertZ J Connection = oraConnection
cmdInsertZ J CommandText = BuildSQLStatement(SQLType Insert z j )
Dim plantLever material oldMaterialNum materialDescription As Object
While sqlDr Read()
plantLever = ReadSqlDataReader(sqlDr )
material = ReadSqlDataReader(sqlDr )
oldMaterialNum = ReadSqlDataReader(sqlDr )
materialDescription = ReadSqlDataReader(sqlDr )
Insert to Oracle table Z J
cmdInsertZ J Parameters AddWithValue( :plantLever plantLever)
cmdInsertZ J Parameters AddWithValue( :material material)
cmdInsertZ J Parameters AddWithValue( :oldMaterialNum oldMaterialNum)
cmdInsertZ J Parameters AddWithValue( :materialDescription materialDescription)
cmdInsertZ J ExecuteNonQuery()
End While
sw Stop()
Loger Info( Reading z j form sql sever used sw Elapsed TotalSeconds ToString())
二 采用DataAdapter实现批量插入
VB NET
sw Start()
Read Z J from SQL Server
Dim sqlCmd As New SqlCommand()
sqlCmd Connection = sqlConnection
sqlCmd CommandText = SELECT * FROM Z J
Dim sqlDr As SqlDataReader
sqlDr = sqlCmd ExecuteReader()
Dim cmdInsertZ J As New OracleCommand()
cmdInsertZ J Connection = oraConnection
cmdInsertZ J CommandText = BuildSQLStatement(SQLType Insert z j )
Dim dtSqlZ J As New DataTable
dtSqlZ J Columns Add( plantLever )
dtSqlZ J Columns Add( material )
dtSqlZ J Columns Add( oldMaterialNum )
dtSqlZ J Columns Add( materialDescription )
Dim plantLever material oldMaterialNum materialDescription As Object
While sqlDr Read()
plantLever = ReadSqlDataReader(sqlDr )
material = ReadSqlDataReader(sqlDr )
oldMaterialNum = ReadSqlDataReader(sqlDr )
materialDescription = ReadSqlDataReader(sqlDr )
dtSqlZ J Rows Add(plantLever material oldMaterialNum materialDescription)
End While
sw Stop()
Loger Info( Reading z j form sql sever used sw Elapsed TotalSeconds ToString())
sw Start()
Dim oraDa As New OracleDataAdapter()
oraDa InsertCommand = cmdInsertZ J
oraDa InsertCommand Parameters Add( :plantLever OracleType Char plantLever )
oraDa InsertCommand Parameters Add( :material OracleType Char material )
oraDa InsertCommand Parameters Add( :oldMaterialNum OracleType Char oldMaterialNum )
oraDa InsertCommand Parameters Add( :materialDescription OracleType Char materialDescription )
oraDa InsertCommand UpdatedRowSource = UpdateRowSource None
oraDa UpdateBatchSize = Adjust the batch size based on testing result
oraDa Update(dtSqlZ J)
sw Stop()
lishixinzhi/Article/program/Oracle/201311/18480
批量插入数据脚本
1、第一种批量插入数据脚本,可以基本满足要求。理解上较为简单,所以这个最常用。
NEXTVAL和CURRVAL的区别:
1、如果 sequence.CURRVAL 和 sequence.NEXTVAL 都出现在一个 SQL 语句中,则序列只增加一次。在这种情况下,每个 sequence.CURRVAL 和 sequence.NEXTVAL 表达式都返回相同的值,不管在语句中sequence.CURRVAL 和 sequence.NEXTVAL 的顺序。
执行脚本结果如下:
3、两个表,同时批量插入数据的脚本
3、
4、 涉及子表时,批量插入数据脚本,
5、 批量修改数据 :
时间取数方式:
一、SYSTIMESTAMP(取当前系统值)
二、SYSDATE(取当前系统值,但只精确到时,分和秒都为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),’"}’)
Oracle:INSERT ALL
INTO A(field_1,field_2) VALUES (value_1,value_2)
INTO A(field_1,field_2) VALUES (value_3,value_4)
INTO A(field_1,field_2) VALUES (value_5,value_6)
SELECT 1 FROM DUAL
在Mybatis中使用
<insert id="insertData" parameterType="java.util.List"
useGeneratedKeys="false">
INSERT ALL
<foreach item="item" index="index" collection="list">
INTO T_GZL_BZ
(
ID,
JGH,
JGMC,
DW,
JGLX,
BZLB,
JGZWLB,
EDGZL,
ZGGZL,
BZ,
CJRBH,
CJRXM,
CJSJ,
SFSZ
) VALUES
(
#{item.id,jdbcType=VARCHAR},
#{item.teacherId,jdbcType=VARCHAR},
#{item.teacherName,jdbcType=VARCHAR},
#{item.departmentId,jdbcType=VARCHAR},
#{item.teacherType,jdbcType=VARCHAR},
#{item.compilationCategory,jdbcType=VARCHAR},
#{item.jobCategory,jdbcType=VARCHAR},
#{item.ratedWorkload,jdbcType=NUMERIC},
#{item.maxWorkload,jdbcType=NUMERIC},
#{item.remark,jdbcType=VARCHAR},
#{item.creator,jdbcType=VARCHAR},
#{item.creatorName,jdbcType=VARCHAR},
#{item.createTime,jdbcType=DATE},
#{item.settings,jdbcType=VARCHAR}
)
</foreach>
SELECT 1 FROM DUAL
</insert>
mapper:
/**
* @param createList
* @return
*/
int insertData(@Param("list") List<WorkloadStandardDto>createList)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)